HELPME.TXT - Antworten auf allgemeine Fragen zu StarView -------------------------------------------------------- StarView - Allgemein -------------------- F: Ich verwende einen Link-Handler und meine Applikation bricht ab. A: Da bei der Verwendung eines Links ein Typecast durchgefhrt wird, kann der Compiler keine šberprfung der aufgerufenen Methode durchfhren. Folgende Punkte sollten bei der Verwendung eines Links beachtet werden: - Jede Methode, die mit einem Link verwendet wird, erh„lt als Argument einen Zeiger auf das aufrufende Objekt. Beispiel. Win::ClickHdl( Button* pButton ); - Jede Methode, die mit einem Link verwendet wird, kann als Ergebnis nur einen Wert vom Typ long liefern. - Bei Compilern auf verschiedenen Systemen k”nnen bestimmte Einschr„nkungen bei der Verwendung von Links bestehen. So sollten Links nicht auf Inline- und virtuelle Methoden zeigen. Weiterhin kann es bei Klassen mit Mehrfachvererbung zu Problemen fhren F: Ich m”chte einen String aus der Resource laden, obwohl es in der Klasse String keinen Resource-Konstruktor gibt. A: Die ResId kann ber einen String-Operator einen String aus der Resource laden. Beispiel: String aStr( ResId( 4711 ) ); F: Ich m”chte einen Warte-Mauszeiger anzeigen, da ich eine gr”áere Operation durchfhre. Leider wird der Mauszeiger nur umgeschaltet, wenn sich der Mauszeiger ber dem Fenster befindet, in den ich den Pointer selektiere. A: Um dem Anwender Ihrer Anwendung anzuzeigen, das die Applikation derzeit keine Eingaben entgegen nehmen kann, sollten Sie die Methode Application::Wait() aufrufen. Auf nicht Multitasking f„higen Systemen (Windows 3.x) wird der Wartecursor sofort umgeschaltet, da das System solange stillgelegt ist, bis Sie die Handler verlassen haben oder Application::Reschedule() aufrufen. Auf Multitasking f„higen Systemen (X-Windows) wird der Wartecursor nur innerhalb der Applikation angezeigt. F: Mein Programm strzt beim Programmstart ab. Woran k”nnte es liegen ? A: Die h„ufigste Fehlerursache ist, daá globale StarView-Instanzen angelegt werden. Da die Konstruktoren der globalen Instanzen vor der Initialisierung von StarView aufgerufen werden, gibt es Programm- abbrche beim Starten der Applikation. Da die Applikationsinstanz global angelegt wird (die einzige Ausnahme), darf Ihre abgeleitete Applikationsklasse auch keine StarView-Klassen als Member haben. Sie sollten in diesem Fall nur Pointer als Member haben und die Instanzen in Main() anlegen. F: Ich will eine Toolbox schreiben, die nicht den Focus bekommt, wenn ich mit der Maus in das Fenster klicke und das frei verschiebar ist. A: Dieser Fenstertyp wird nicht von StarView und nicht von den Fenstersystemen untersttzt. Z.B. gibt es unter Windows keine Fenster, die nicht aktiv werden, wenn man in das Fenster klickt. Was untersttzt wird, ist ein Fenster innerhalb einer MDI-Applikation das als Parent das Applikationsfenster hat. Das Fenster sollte am Rand des Applikationsfenster positioniert werden: class ToolBar : public Window { public: ToolBar() : Window( pApp->GetAppWindow(), WinBits( 0 ) ) {} ... }; void AppWin::Resize() { // Da das Fenster nicht frei verschiebar ist, wird es // am linken Rand des Applikationsfensters positioniert. pToolBar-> ChangeSizePixel( Size( pToolBar->GetSizePixel().Width(), GetOutputSizePixel().Height() ) ); } F: ??? A: Viele Fragen k”nnen auch im systemabh„ngigen Teil beantwortet sein, wobei viele Antworten auch fr andere Systeme zutreffen. Deshalb sollten Sie auch die systemabh„ngigen Teile durchlesen. StarView fr Windows -------------------- F: Ich m”chte eine FileOpen-Dialogbox implementieren. Leider gibt es in StarView keine Untersttzung vom Filesystem. A: In dieser Version untersttzt StarView nicht das Filesystem. Um den FileDialog von Windows 3.1 zu benutzen, k”nnen Sie das Programm \EXAMPLES\FILEDLG verwenden, das auch den Einsatz der Sysdepen- Klasse demonstiert. Fr Datei Ein- und Ausgabefunktionen sollten Sie die Streams benutzen. Fr die Verzeichnisanzeige sollten Sie Sich folgendermaáen helfen: #include void MyListBox::InsertDir( const String& rPfad ) { SendMessage( Sysdepen::GethWnd( *this ), // Windowhandle LB_DIR, // Verzeichnis 0, // Attribute (Windows-Referenz: DlgDirList) (long)(const char*)rPfad ); // Pfad inkl. WildCards } F: Wenn ich den KeyInput-Handler berlagere, kann ich die Applikation unter Windows nicht mehr ber Alt+F4 beeenden oder ber die Alt-Tasten das Men aktivieren. A: Da an den KeyInput-Handler alle Tasten bergeben werden, mssen Sie die Tasten auswerten, die Sie in Ihrem Programm verwenden. Alle anderen KeyEvents mssen Sie an das System weiterleiten, in dem Sie den KeyInput-Handler der Basisklasse rufen: class MyWindow : public WorkWindow { ... void KeyInput( const KeyEvent& rEvt ); ... }; void MyEdit::KeyInput( const KeyEvent& rEvt ) { switch ( rEvt.GetKeyCode().GetCode() ) { case KEY_LEFT: ... break; ... default: // Zeichencode ohne Alt-Taste if ( !rEvt.IsMod2() && rEvt.GetCharCode() ) ... else WorkWindow::KeyInput( rEvt ); } } F: Ich habe den KeyInput-Handler vom SingleLineEdit aufgerufen und einen eigenen KeyEvent bergeben. Das Editfeld bekommt leider nicht die Taste. A: Da haben Sie leider recht. Dies ist ein Problem, wofr wir noch keine L”sung habem. Dieses Problem gilt auch fr alle anderen Controls und auch fr die Maus-Handler. F: Damit der Benutzer bei falscher Eingabe nicht das Editfeld verlassen kann, habe ich im LooseFocus-Handler eine Prfroutine implementiert, die im Fehlerfall den Focus wieder auf das Editfeld setzt. Dabei kam die Focussteuerung leider durcheinander. A: Dabei kommt leider Windows durcheinander. Was von StarView angeboten wird, ist folgende L”sung: class MyEdit : public SingleLineEdit { ... void KeyInput( const KeyEvent& rEvt ); ... }; void MyEdit::KeyInput( const KeyEbent& rEvt ) { // Umlaute drfen nicht eingegeben werden if ( (unsigned char)rEvt.GetCharCode() > 127 ) Sound::Beep(); else // Alle anderen Tasten an das Editfeld weiterleiten SingleLineEdit::KeyInput( rEvt ); } Normalerweise wird die Prfung auf gltige Eingaben im Click-Handler des OK-Buttons durchgefhrt. Diese L”sung hat gegenber Ihrer L”sung den Vorteil, daá der Anwender den Cancel-Button aktivieren kann und noch in andere Applikationen wechseln kann. F: Unter Windows ist es m”glich, Edit-Controls ein Flag fr Paáwort- eingabe zu bergeben. Dies ist in StarView nicht m”glich. Wie kann ich dies auch zur Not systemabh„ngig implementieren ? A: StarView bietet ber die Sysdepen-Klasse die M”glichkeit an, auf Window-Handles zurckzugreifen. Damit ist es m”glich, verschiedene Windows-Funktionen systemabh„ngig zu nutzen: SetWindowLong( Sysdepen::GethWnd( aMyWin ), GWL_STYLE, ... ); GetWindowWord( Sysdepen::GethWnd( aMyWin ), GWW_ID ); Falls Ihnen noch verschiedene Funktionen in StarView fehlen, teilen Sie uns das bitte weiterhin mit, da StarView auch in Zukunft um neue Funktionen erweitert wird. F: Unter Windows ist die Speicherverwaltung kompliziert zu benutzen. Wie wird unter StarView der Speicher verwaltet oder muá ich die Windows- Funktionen benutzen. A: StarView benutzt einen eigenen Memory-Manager, der das new und delete des C++-Compilers ersetzt. Lesen Sie bitte dazu den Punkt Wichtige Informationen in der Datei README.TXT. F: Wenn ich den Resource Compiler aufrufe, bekomme ich die Fehlermeldung, das der Compiler nicht genuegend Speicher hat. A: Falls Sie den Borland-Compiler benutzen, mssen Sie darauf achten, das Sie MAKER benutzen und nicht MAKE. Auáerdem sollten Sie die Environment-Variable DOS16M auf den richtigen Wert (siehe Datei readme.txt) setzen, wenn Sie den RSC2Z verwenden. F: Ich bekomme Link-Fehler. Was k”nnte ich falsch gemacht haben ? A: Haben Sie die SV.LIB oder die TOOLS.LIB dazugelinkt ? Haben Sie mit den richtigen Schaltern bersetzt, da einige Schalter auf das Namemangling Auswirkungen haben ? Haben Sie eine globale Instanz von Ihrer Applikationsklasse angelegt ? F: Beim Anlegen neuer Project-Files fr Borland 3.0 erhalte ich beim Linken der Applikation "unresolved Externals". A: Da in der Borland-Umgebung bestimmte Switches und Parameter eingestellt werden, ist es am einfachsten eine bestehende Projektdatei zu kopieren, die alten Eintr„ge zu l”schen und die neuen Eintr„ge aufzunehmen.