Programmieren mit C++

Borland C++ Builder

Allgemeine Fragen

Handles und Eingriffe in VCL

Warum führt der Aufruf von
SendMessage(Form1->Edit1,ED_FMTLINES, true, 0);
zu einem Compiler-Fehler?

Frage

Die meisten Windows API-Funktionen erwarten als ersten Parameter ein Handle des Fensters auf dem sie operieren sollen. Dieses Handle ist ein Zeiger auf eine Struktur, in der Windows Informationen über das jeweilige Fenster ablegt.

Statements wie Form1->Edit1 repräsentieren jedoch nicht das Windows-Handle der Control, sondern einen VCL-Typ, der ein Zeiger auf eine Klasse ist.

Um das Fensterhandle zu erhalten, muß das Property Handle abgefragt werden, das die meisten visuellen Komponenten besitzt:

Form1->Edit1->Handle

Dieser Aufruf liefert das Windows-Handle der Control Edit1.

Lösung

Wie erhält man das Application-Handle?

Frage

In Klassen, die von TForm abgeleitet sind, funktioniert der Aufruf

HINSTANCE hInst = reinterpret_cast(GetWindowLong(Handle, 
                                                 GWL_HINSTANCE);

wobei Handle das Fensterhandle bezeichnet.

Lösung

Beim Portieren einer Delphi-Anwendung stellte sich heraus, daß der Zugriff über die Methode IndexOf einer Listbox nicht direkt portierbar ist. Warum?

Frage

Obwohl Delphi und BCB die gleiche VCL-Bibliothek benutzen, gestaltet BCB die Zugriffe auf eine Member anders.

Während in Delphi

ListBox1.IndexOf(ListBox2.Items[i]);

den Zeiger auf den i-ten String der Listbox liefert, schlägt der gleiche Aufruf unter BCB fehl, was daran liegt, daß im Builder Items ein TString ist und IndexOf einen AnsiString erwartet. Als Ausweg bietet sich an

ListBox1->Items->IndexOf(ListBox2->Items->Strings[i]);

Bei dieser Lösung ist IndexOf ein Member der Klasse TStrings, aber nicht der TListBox Klasse. Das Property Items von TListBox enthält ein String-Property, das ein Array aus TString ist. Damit klappt der Zugriff.

Lösung

In welcher Reihenfolge werden die Event-Handler beim Erzeugen eines Formulars aufgerufen?

Frage

Der Aufruf erfolgt in der nachfolgend dargestellten Reihenfolge:

  • OnCreate
  • OnShow
  • OnPaint
  • OnActivate
  • OnResize
  • (erneut) OnPaint

Lösung

Wie kann eine Komponente abfragen, ob einem Ereignis eine Behandlungsmethode zugewiesen wurde?

Frage

Wenn einem Event ein Handler zugewiesen wurde, ist der zugehörige Zeiger ungleich NULL, was wie folgt abgefragt werden kann:

{
  if (MyObject->OnMyEvent!=NULL) {
    MyObject->OnMyEvent()
  }
}

Das gezeigte Beispiel ruft die Behandlungsmethode nur dann über den Event-Zeiger auf, wenn der Zeiger nicht NULL ist.

Lösung

Wie kann ein einzelnes Element einer TRadioGroup deaktiviert werden?

Frage

Das Property Items der Klasse TRadioGroup ist ein TString, dessen einzelne Zeilen nicht deaktiviert werden können. Als Umweg bietet es sich an, auf das nicht dokumentierte Property Controls zurückzugreifen. Controls ist ein Array aller TControl Zeiger einer Control. Damit ist der nachfolgende Aufruf möglich.

RadioGroup->Controls[0]->Enabled=false;

Es bleibt jedoch erforderlich, daß die Anwendung zuvor feststellt, welches der korrekte Index auf die betreffende Zeile der TRadioGroup die richtige ist. Da jedoch Controls[i] einen vollwertigen Zeiger auf das jeweilige Control liefert, kann der Caption-Text der Control abgefragt werden, bzw. es ist auch möglich, über das Property Tag entsprechende Unterscheidungs-IDs einzusetzen.

Lösung

Wie werden Kommandozeilenparameter von einer BCB-Anwendung ermittelt?

Frage

Der Zugriff auf die Kommandozeile erfolgt über die globale Variable ParamStr(). Der erste Parameter ParamStr(0) liefert den Namen der ausführen den Programmdatei einschließlich des kompletten Pfades, während die eigentlichen Parameter des Aufrufs ab ParamStr(1) übergeben werden. Die Anzahl der Parameter läßt sich über die ebenfalls globale Funktion ParamCount() ermitteln, so daß die nachfolgende Anweisung alle Parameter ermittelt und anzeigt:

for (int x=0; x <= ParamCount(); x++)
   ShowMessage(ParamStr(x));

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:18:47 von textarchiv.alojado.de