Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TabControl (https://www.delphipraxis.net/5872-tabcontrol.html)

Lillebrohr 21. Jun 2003 20:27


TabControl
 
Hi maggots,

ich bin gerade dabei einen HTML-Editor zu coden. so wenn ich auf Datei--> Neu klicke soll ein neues Tab kreiert werden und ein neuer Inhalt in dem RichEdit Feld.

Das bedeutet ich habe ein RichEditFeld. Ich habe es mir so gedacht. Ich werde die Inhalte in eine Stringlist laden und beim Aufruf eines Tabs soll der entsprechende Inhalt dort wiedergegeben werden.

Bsp: TabControl1.TabIndex = FileList.Strings[TabControl1.TabIndex], oder so ähnlich.

Aber ich weiß nicht wie ich das umsetzen soll ?


Danke

Christian Seehase 21. Jun 2003 20:37

Moin Lillebrohr,

nimm' doch statt des TabControls ein PageControl.
Dann kannst Du bei jedem neuen TabSheet auch gleich ein RichEdit mit darauf generieren, und hast dann Deine StringListe als RichEdit.Lines gleich mit dabei.
Das kostet zwar mehr Resourcen, als ein TabControl, erleichtert allerdings auch die Verwaltung. Du müsstest Dir sonst bei jedem Wechsel auch die Zustände der einzelnen RichEdits mit speichern (Position des Carets, markierte Textstellen), und beim Umschalten wiederherstellen.

Das mit den Dateien je Tab (bei einem TabControl könntest Du auch als StringListe lösen, in der dann die Pfade der Dateien gespeichert sind, wobei dann der TabIndex als Index in der StringListe dient.
Wird eine Datei geschlossen, wird nicht nur das Tab entfernt, sondern auch der Eintrag aus der Dateiliste.
Die Dateien könnstest Du dann in einem StringStream speichern und mittels RichEdit.Lines.LoadFromStream aus diesem wieder laden.

Lillebrohr 22. Jun 2003 16:32

Hi Christian,

Danke erstmal für deine Hilfe. Aber ich bin da ein bißschen überfragt.
Ich hab das schonmal probiert eine Komponente zur Laufzeit zu generieren, aber das hat nicht richtig geklappt.

Könntest du mir eventuell an einem CodeSnippet zeigen wie so umzusetzen wäre ??

Danke, nochmal. Schönen Tag auch noch.


Cu

Christian Seehase 23. Jun 2003 12:58

Moin Lillebrohr,

die Minimalvariante:

Delphi-Quellcode:
  with TRichEdit.Create(self) do begin
    Parent := frmMAIN;
  end;
Weitere Eigenschaften musst/kannst Du dann auch noch setzen.

Mit self wird angegeben, wer der Besitzer der Kompo ist. Wird diese freigegeben, wird auch das RichEdit wieder freigegeben, deshalb muss man sich nicht selber darum kümmern.
self konnte ich hier verwenden, da es in einer Methode des Hauptformulares steht, es lässt sich aber auch durch jede andere Kompo ersetzen.
Die Angabe von Parent sagt aus, welches Fenster der Kompo unmittelbar übergeordnet ist. Ohne die Angabe wäre von dem RE nichts zu sehen. Ausserdem wird z.B. die Position des Controls relativ zum Parent angegeben.

Lillebrohr 23. Jun 2003 14:10

Guten Tag,

ja aber wie kann ich das jetzt ansprechen ??? Wie kann ich sagen das wenn ich auf Pagecontrol5 klicke das dann auch der inhalt dort reingeladen wird ??? Ich meine wo setze ich diese MinimalVariante ein ??

In das OnClick Ereignis der einzelnen Pages oder wie ?

Udn wie kreiere ich das wenn ich auf Datei --> Neu klicke ??



Danke für deine hilfe

Christian Seehase 23. Jun 2003 14:22

Moin Lillebrohr,

die Komponenten bekommen beim Erzeugen alle einen Namen verpasst, nach dem kannst Du suchen (FindComponent, hatten wir schon oft).
Wichtig: Es muss immer das FindComponent der übergeorneten Kompo genommen werden, in Deinem Beispiel als PageControl5.FindComponent.

Das Ergebnis ordnest Du dann einer Variablen vom Typ TRichEdit zu, und kannst dann einfach auf alle Eigenschaften und Methoden (z.B. Lines.LoadFromFile) zugreifen.

Was ich Dir gezeigt hatte ist ein Minimalbeispiel. Du kannst natürlich auch alle anderen Eigenschaften/Ereignisroutinen dort zuweisen.
Bei letzterem ist es ganz praktisch sich mal eine Kompo auf das Formular zu legen, die man dynamisch erzeugen will, und dann schon mal auf dem üblichen Wege die Ereignisroutinen erstellen.
Anschliessend kann man die Kompo wieder löschen, die Prozeduren bleiben ja erhalten.
Das erleichtert das Erstellen der Prozeduren ungemein.

Lillebrohr 25. Jun 2003 17:33

Guten Tag Christian,


Oh Gott, entweder bin ich zu dumm oder naja ebend anders. Aber ich bekomme das einfach nicht gebacken.

Mit FindComponent komm ich irgendwie nicht klar.
Ich glaube du mußt es mir so erklären als wenn ich delphi noch nie gehört habe. :?

Tut mir leid wenn ich dir so ein Stress bereite. :cry:

Tschüß

Christian Seehase 25. Jun 2003 18:38

Moin Lillebrohr,

dann will ich's mal versuchen näher zu erklären:

Mit FindComponent kannst Du, wie der Name schon vermuten lässt Komponenten finden, die einer anderen Komponente untergeordnet sind.

Wenn Du z.b. ein Formular Form1 hast, und darauf zwei Button (Button1 und Button2), kannst Du diese auch finden, indem Du
Delphi-Quellcode:
Form1.FindComponent('Button1');
verwendest.

Da FindComponent, für den Fall, dass die gesuchte Komponente gefunden wurde einen Zeiger auf die Kompo zurückliefert, kannst Du sie auch zwischenspeichern

Delphi-Quellcode:
var
  btnDyn : TButton;

begin
  btnDyn := Form1.FindComponent('Button1') as TButton;
  if Assigned(btnDyn) then begin
  // nur falls der Button auch gefunden wurde kann damit weitergearbeitet werden
  end;
end;
und anschliessend mit btnDyn alles verwenden, was Du auch direkt mit Button1 hättest machen können.

In der Regel sucht man natürlich nach dynamisch erzeugten Komponenten, deshalb ist es wichtig, diesen beim Erzeugen auch (eindeutige!) Namen zu geben, damit man sie wiederfinden kann. (Es gäbe zwar auch einen Weg dies mit unbenannten Controls zu machen, aber das würde hier jetzt wohl zu weit führen).

Würde der Button jetzt aber z.B. auf einem Panel (Panel1) liegen, welches wiederum auf dem Formular liegt, könnte es auf diesem Wege nicht gefunden werden, da es diesem nicht untergeordnet ist.
Um den Button nun auf dem Panel zu suchen müsste man

Delphi-Quellcode:
  btnDyn := Panel1.FindComponent('Button1') as TButton;
schreiben.

Welcher Komponente als übergeordnete gilt, wird durch die Eigenschaft Parent festgelegt.
Wird Parent geändert, ändert sich auch die Position.
Liegt der Button z.B. links oben auf dem Panel, und die Eigenschaft Parent wird auf Form1 geändert, findet man den Button anschliessend links oben auf dem Formular wieder.

Lillebrohr 25. Jun 2003 19:01

Hallo Christian,

Mein Aktualisieren Button ist schon ganz durchgedrückt. :D

D.h. zum Abschluss:

Ich habe ein PageControl. Wenn ich auf 'Datei-->Neu' klicke passiert dann das:

1. Es wird ein neues TabSheet geadded (Richtig ?)
2. Auf dem neuen Tab generiere ich ein RichEditFeld.
1.Problem (Das Syntaxhighlighting müsste ja dann auch angepasst
werden.
2.Wenn es generiert wird erhält es einen Namen. Aber dann sind die
doch bei jedem Erzeugen gleich. Ich denke das muss auch so sein.
wegen der FindComponent-Funktion.
3. Wenn ich nun auf einen der Tabs klicke rufe ich die FindComponente
Funktion auf. (Richtig ?)
4. Wenn ich nun das RichEditFeld gefunden habe, welches z.B. in felddyn
abgespeichert wurde, kann ich z.B alles das machen was ich auch mit
Richedit1.XXXX gemacht habe.

Hoffe das mein kleines Gehirn das verkraftet und heut Nacht umsetzen kann. :freak:
Entschuldigung wenn ich dich so strapaziert habe. Hoffe du nimmst es mir nicht übel denn ich werde dich weiter belasten. Darauf kannst du dich gefasst machen. :mrgreen:

Tschau, ma fella

Christian Seehase 25. Jun 2003 19:11

Moin Lillebrohr,

Zitat:

Zitat von Lillebrohr
2.Wenn es generiert wird erhält es einen Namen. Aber dann sind die
doch bei jedem Erzeugen gleich.

Standardmässig erhält es dynamisch erzeugt keinen Namen. Einen eindeutigen Namen musst Du selber vergeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz