AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TabControl

Ein Thema von Lillebrohr · begonnen am 21. Jun 2003 · letzter Beitrag vom 31. Jan 2012
Antwort Antwort
Seite 1 von 2  1 2      
Lillebrohr
(Gast)

n/a Beiträge
 
#1

TabControl

  Alt 21. Jun 2003, 21:27
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 21. Jun 2003, 21: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Lillebrohr
(Gast)

n/a Beiträge
 
#3
  Alt 22. Jun 2003, 17: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 23. Jun 2003, 13: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Lillebrohr
(Gast)

n/a Beiträge
 
#5
  Alt 23. Jun 2003, 15: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 23. Jun 2003, 15: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Lillebrohr
(Gast)

n/a Beiträge
 
#7
  Alt 25. Jun 2003, 18: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.

Tschüß
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 25. Jun 2003, 19: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
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

  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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Lillebrohr
(Gast)

n/a Beiträge
 
#9
  Alt 25. Jun 2003, 20:01
Hallo Christian,

Mein Aktualisieren Button ist schon ganz durchgedrückt.

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.
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.

Tschau, ma fella
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 25. Jun 2003, 20:11
Moin Lillebrohr,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.
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