home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD2.mdf
/
c
/
library
/
starview
/
doc
/
helpme.txt
next >
Wrap
Text File
|
1992-07-31
|
10KB
|
224 lines
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 durchgeführt wird,
kann der Compiler keine Überprüfung der aufgerufenen Methode
durchführen.
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 führen
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 durchführe. 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 stürzt 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-
abbrüche 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 unterstützt. Z.B. gibt es unter Windows keine
Fenster, die nicht aktiv werden, wenn man in das Fenster klickt.
Was unterstützt 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 für andere Systeme zutreffen. Deshalb
sollten Sie auch die systemabhängigen Teile durchlesen.
StarView für Windows
--------------------
F: Ich möchte eine FileOpen-Dialogbox implementieren. Leider gibt es in
StarView keine Unterstützung vom Filesystem.
A: In dieser Version unterstützt 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. Für Datei Ein- und Ausgabefunktionen sollten Sie
die Streams benutzen. Für die Verzeichnisanzeige sollten Sie Sich
folgendermaßen helfen:
#include <sysdep.hxx>
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, müssen Sie
die Tasten auswerten, die Sie in Ihrem Programm verwenden. Alle
anderen KeyEvents müssen 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, wofür wir
noch keine Lösung habem. Dieses Problem gilt auch für
alle anderen Controls und auch für die Maus-Handler.
F: Damit der Benutzer bei falscher Eingabe nicht das Editfeld verlassen
kann, habe ich im LooseFocus-Handler eine Prüfroutine 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 dürfen 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 Prüfung auf gültige Eingaben im Click-Handler
des OK-Buttons durchgeführt. Diese Lösung hat gegenüber 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 für 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 zurückzugreifen. 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, müssen 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 für 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.