Diverse Fragen zur Gui-Gestaltung
-
Hallo,
ich bin vor ein paar Tagen auf dieses Forum gestoßen und habe damit begonnen mich hier erst einmal einzulesen, doch es gibt noch die ein oder andere Frage offen, auf die ich bis jetzt keine Antwort gefunden habe.
Zu meiner Person:
Ich programmiere schon eine Weile C++ mit dem BCB 5 und möchte mich nun an der Erstellung von GUI's versuchen. Ich habe hier in Java schon diverse Erfahrungen sammeln können.Nun aber zu meinen Fragen:
- Wenn ich den Builder starte, habe ich bereits immer ein Fenster, wo ich Komponenten platzieren kann. Was ist das genau, eine neue Anwendung, ein leeres Formular oder ein Frame. Wo bestehen die generellen Unterschiede zwischen diesen drei Möglichkeiten ?
- Ich habe gelesen, dass die Gui's im Builder alle die Bibliothek VCL verwenden, bei Visual C++ soll dies MFC sein. Worin unterscheiden sich diese beiden Klassen grundlegend ? Gibt es sonst noch eine solche Bibliothek welche besondere Bedeutung hat ? Wieso gibt es hier überhaupt verschiedene Standards von den einzelnen Herstellern (bei Java nur AWT oder SWING)
- Warum haben die grafischen Komponenten einen Präfix T ?
- Ich habe versucht den Text eines Textfeldes (TEdit) mittels einfacher get- und set-Methoden zu holen und zu manipulieren. Diese Methoden habe ich leider nicht gefunden, gibt es nicht solche "universellen" Methoden, und muss ich für jede Komponente immer in der Hilfe nachschauen ?
- Ich kenne es aus Java so, dass ich eine eine GUI-Klasse erstelle und von dieser Klasse anschließend in meinem Programm eine Instanz erzeuge um diese zu betrachten, dies scheint bei Builder etwas anders zu sein, da hier ja keine weitere Main-Klasse angelegt wird.
- So, eine Frage habe ich mir noch aufgehoben
. Es ist ja ein Unterschied
ob die Instanzen meiner Klasse in einer Konsolen-Anwendung oder in einer Gui
verwendet werden sollen. Da ich bis jetzt mit C++ ausschließlich auf der
Konsole gearbeitet habe, hatte ich der Einfachheit halber Methoden zum Anzeigen als void definiert und den entsprechenden Text direkt mittels cout ausgegeben. Wenn meine Klasse natürlich jetzt Gui-kompatibel sein soll, so muss sie halt einen String statt void zu rückgeben der anschließend in der Gui angezeigt wird.
Was muss ich sonst beachten wenn ich eine "universelle" Klassen erstellen will, die sowohl Konsolen als auch Gui kompatibel sind ?So, ich bin mal gespannt wer sich rantraut
. Auf jeden Fall schon mal Danke für eure Beiträge
.Gruß
Brasi
-
als erstes solltest du dir ein gutes buch zulegen mit dem du grundlegende fragen selbst beantworten kannst:
C++ mit dem Borland C++Builder | ISBN: 3540629947
c++ != java, d.h. was du dort hast, gibt es nicht zwangsläufig im c++ oder einer anderen programmiersprache...
1. wenn du den builder startest (und sofern nicht autospeichern in den editor-optionen aktiv ist), fängst du mit einer neue leeren anwendung an. siehe menüpunkt Datei->Neu->Anwendung. diese beinhaltet bereits dein hauptformular (das gepunktete leere fenster) und die zugehörige unit.
2. naja vcl ist von borland und mfc von microsoft. jeder kocht da sein eigenes süppchen. java kommt doch von sun und ham damit wieder was eigenes gebastelt.
3. alle klasse der vcl ham ein T (fuer Typ) davor nicht nur die graphischen. bei microsoft ist der präfix übrigens ein C (fuer Class). höchstwahrscheinlich dafür um die klassen besser von anderen nutzerspezifischen klassen unterscheiden zu können, was aber heute wohl eher mit namespace gemacht wird.
4. siehe oben das buch, jede komponente hat verschiedene eigenschaften (siehe hilfe). jede dieser eigenschaften wird intern ueber ein setter/getter geändert (wenn das nötig ist). den Text eines TEdit kannst du einfach so ändern, in dem du ihm etwas neues zuweist oder ausliest.
// Text auslesen AnsiString InhaltdesEdit = Edit1->Text; // Text setzen Edit1->Text = "BlahFasel";5. jedes formular (siehe header) ist auch nur eine klasse die alle komponenten usw. beinhaltet und beim start der anwendung erzeugt wird. das kann sowohl automatisch (alle formulare auf einmal) oder einzel (in dem du jeweils eine instanz für das formular erzeugst, was du anzeigen willst) gehen. jedes erzeugte formular ist global verfügbar, wenn du den entspr. header einbindest.
6. verzichte auf alle VCL elemente (vorallem auf alle gui-elemente), dann dürfte das mit der universellen klasse auch klappen.
-
Achtung, Schleichwerbung ;-):
http://www.junix.ch/bcb/help/hilfe.html
Sehr hilfreich, um viele Standardfragen zu klären.
-
Erst mal vielen Dank an euch beiden. Ich denke es ist mir jetzt einiges klarer geworden und die Hilfe sehe ich nun auch als nützliches "Hilfs"mittel.
Ich bin jedoch etwas verwundert, dass der Text eines TEdit direkt über das entsprechende Attribut angesprochen werden kann, wie es im Beispielcoding zu sehen ist. Dies bedeutet doch gleichzeitig, dass diese Eigenschaft nicht private ist und die verstößt doch gegen die grundlegenden Gedanken der Objektorientierung, wo die Eigenschaften einer Klasse private sind und wir mittels get- und set-Methoden auf das jeweilige Attribut zu greifen.
-
Hallo
Nein, es ist korrekt, nur die VCL-Eigenschaften spezielle Erweiterungen nutzen um es so aussehen zu lassen, als ob z.B. TEdit::Text ein einfacher direkter AnsiString wäre. Ist es aber nicht, wie die BCB-Hilfe zeigt.
__property AnsiString Text = {read=GetText, write=SetText};Und dort stehen dann auch der Getter und der Setter, der mit dem Zugriff auf die Eigenschaft aufgerufen wird, um das eigentlich, unsichtbare private-Element zu lesen bzw. zu bearbeiten. Mit dieser __property-Erweiterung ist es dann Möglich, diese Eigenschaften z.B. über den Objektinstektor zu bearbeiten, auch dann bei selbstgeschriebenen Komponenten.
Leider hat diese __propery-erweiterung auch einen NachteilEdit1->Text += "Hallo"; // Wird nicht ausgeführt,da nur temporär etwas verändert wird Edit1->Text = Edit1->Text + "Hallo"; // Wird ausgeführtbis bald
akari