Verständnisfrage: Einfügen von TabSheets zur Laufzeit
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Hallo
Ich sehe wohl schon wieder den Wald vor lauter Bäumen nicht.
Ich möchte in eine Pagecontrol zur Laufzeit Tabsheets mit dazugehörigen Memos einfügen.
((Eigentlich zunächst nur ein Editor der mehrere Dokumente öffnen kann.)
Zur Entwurfszeit bekommen diese Tabsheets ja recht elegant einen Namen über den ich sie dann referenzieren kann.
Wie macht man das (elegant) zu LZ? Mit einem Array möchte ich erst gar nicht anfangen das ist erstens nicht elegant und hat nur Nachteile.
In BP hab ich solche Dinge immer über (doppelt verkettete) Listen aus Zeigern realisiert.
Macht man das noch so, oder gibt es da schon einfachere Methoden?
Grüße
Christian
Ich sehe wohl schon wieder den Wald vor lauter Bäumen nicht.
Ich möchte in eine Pagecontrol zur Laufzeit Tabsheets mit dazugehörigen Memos einfügen.
((Eigentlich zunächst nur ein Editor der mehrere Dokumente öffnen kann.)
Zur Entwurfszeit bekommen diese Tabsheets ja recht elegant einen Namen über den ich sie dann referenzieren kann.
Wie macht man das (elegant) zu LZ? Mit einem Array möchte ich erst gar nicht anfangen das ist erstens nicht elegant und hat nur Nachteile.
In BP hab ich solche Dinge immer über (doppelt verkettete) Listen aus Zeigern realisiert.
Macht man das noch so, oder gibt es da schon einfachere Methoden?
Grüße
Christian
Früher war alles besser. Und aus Holz!
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Naja, kommt auf das genaue Szenario an. Extra Listen brauchst du allerdings nicht führen, die Controls wissen ja schon über ihre Childs Bescheid.
Du Kannst nat. deinen TabSheets Namen geben, z.B. Dateiname des Memo Textes oder sonst ein UID. die kann man dann wieder finden mit z.B.
PageControl1.FindChildControl('TabSheet2')
Vllt. reicht es auch nur mit ActivePage oder SelectNextPage zu arbeiten.
Wie gesagt, das kommt drauf an wofür.
Du Kannst nat. deinen TabSheets Namen geben, z.B. Dateiname des Memo Textes oder sonst ein UID. die kann man dann wieder finden mit z.B.
PageControl1.FindChildControl('TabSheet2')
Vllt. reicht es auch nur mit ActivePage oder SelectNextPage zu arbeiten.
Wie gesagt, das kommt drauf an wofür.
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
PageControl bringt alles mit um auf die einzelnen Tabsheets zuzugreifen.
Möglichkeiten:
// Achtung aus dem Kopf geschrieben, die Syntax muß also nicht 100% sein
ActualPageIndex gibt dir den Index das aktuellen TabSheet
ActualPage gibt dir eine Referenz auf das aktuelle TabSheet
Pages[n] gibt dir eine Referenz auf das TabSheet mit dem Index n
usw. usw.
Möglichkeiten:
Code: Alles auswählen
// Durchlaufe alle TabSheets
for i := 0 to pred(TPageControl1.PageCount) do begin
// TPageControl1.Pages[i] etc.
end;
ActualPageIndex gibt dir den Index das aktuellen TabSheet
ActualPage gibt dir eine Referenz auf das aktuelle TabSheet
Pages[n] gibt dir eine Referenz auf das TabSheet mit dem Index n
usw. usw.
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Na, dann werd' ich das einmal versuchen.
Danke.
Danke.
Früher war alles besser. Und aus Holz!
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Auf diese Möglichkeit wurde ich hier im Forum bereits gestossen und hab sie auch schon verwendet.DiBo33 hat geschrieben:PageControl bringt alles mit um auf die einzelnen Tabsheets zuzugreifen.
Möglichkeiten:Code: Alles auswählen
// Durchlaufe alle TabSheets for i := 0 to pred(TPageControl1.PageCount) do begin // TPageControl1.Pages[i] etc. end;
Ich hatte irgendwie nur ein Problem damit, daß ich von dem Memo das ich als leeres Editorfenster von Beginn an hinstelle einen Namen weiß, von den zur Laufzeit erstellten jedoch nicht. (Ist aber wahrscheinlich egal ...)
Ich denke alle meine (dummen) Fragen entstehen wohl daraus, daß ich (noch) nicht genau begriffen habe was die IDE mir an Arbeit wo abnimmt.
Ich möchte z.B. daß mein Editor alle Buchstaben sofort bei der Eingabe in Großbuchstaben umwandelt.
Leichte Übung, dachte ich. Eine Methode Memo1.OnKeyPress entsteht per Mausklick. Ein paar Zeilen Code und das funktioniert prächtig.
Code: Alles auswählen
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: char);
var Code : byte;
begin
if Key in [#97..#122] then
begin
Code := ord(Key);
dec(Code,32);
Key := Chr(Code);
end;
end;
Wie bring ich das den "neuen" Fenstern bei, die erst zur Laufzeit entstehen?
Da muß ich wohl eine abgeleitete Klasse von TMemo begründen, die das schon kann.
So und jetzt beißt sich die Katze in den Schwanz:
Kann ich diese neue Klasse auch so bequem (als leeres Editorfenster) in der IDE per Mausklick einfügen wie TMemo, damit ich das erste Fenster nicht anders behandeln muß wie die weiteren?
Irgendwie hat's da noch nicht Klick! gemacht ...
Früher war alles besser. Und aus Holz!
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Du musst die Procedure dem OnKeyPress-Event des jeweils angelegten Memofelds übergeben.
Achtung aus dem Kopf geschrieben, ich kanns also im Moment nicht prüfen, aber so in etwa
Achtung aus dem Kopf geschrieben, ich kanns also im Moment nicht prüfen, aber so in etwa
Code: Alles auswählen
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: char);
var Code : byte;
begin
if Key in [#97..#122] then
begin
Code := ord(Key);
dec(Code,32);
Key := Chr(Code);
end;
end;
procedure TForm1.AddTabSheetWithMemo;
var
t: TTabSheet;
m: TMemo;
begin
// TabSheet erstellen
t := TTabSheet.Create(TPageControl1);
// Innerhalb des TabSheets ein Memo
m := TMemo.Create(t);
// Damit das Memo auch zu sehen ist
m.Parent := t;
// Volle Größe
m.Align := alClient;
// KeyPressEvent zuweisen
m.OnKeyPress := @Memo1KeyPress;
// Hier musst du noch das TabSheet dem PageControl zuweisen, das weiß ich allerdings nicht aus dem Kopf
end;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Ich habe mal aus langeweile so ein Editor angefangen. Ich hänge mal das Projekt an. Vielleicht nützt es dir oder anderen etwas. Ich nutzte hier allerdings SynEdit. Du kannst es ja anpassen oder als "Vorlage" bzw. Schablone nutzen.
Es könnte sein, dass du noch Einstellungen unter Projekt machen musst. Der Editor ist auch noch nicht Fertig.
Es könnte sein, dass du noch Einstellungen unter Projekt machen musst. Der Editor ist auch noch nicht Fertig.
- Dateianhänge
-
plEditor.zip
- (326.42 KiB) 74-mal heruntergeladen
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
@DiBo33:
Danke sehr, das funktioniert prächtig.
@pluto:
Vielen Dank ich werde mir das gerne ansehen.
Danke an alle.
Danke sehr, das funktioniert prächtig.
@pluto:
Vielen Dank ich werde mir das gerne ansehen.
Danke an alle.
Früher war alles besser. Und aus Holz!
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Noch was, du kannst auch ein Char in-/decrementieren, somit reicht in deiner KeyPress ein Einzeiler
Code: Alles auswählen
if (Key in ['a'..'z']) then dec(Key, 32);
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Noch so ein Trick und mein Programm wird unleserlich wie Hardcore-C++ Code.DiBo33 hat geschrieben:Noch was, du kannst auch ein Char in-/decrementieren, somit reicht in deiner KeyPress ein EinzeilerCode: Alles auswählen
if (Key in ['a'..'z']) then dec(Key, 32);

Danke f. d. Tipp.
Früher war alles besser. Und aus Holz!
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
@pluto:
Ich kann Deinen plEditor leider nicht kompilieren, da die Unit EditorOptions fehlt.
Hast Du die?
Zum herumprobieren wäre es angenehm, könnte ich auch kompilieren und ausführen
Grüße
Christian
Ich kann Deinen plEditor leider nicht kompilieren, da die Unit EditorOptions fehlt.
Hast Du die?
Zum herumprobieren wäre es angenehm, könnte ich auch kompilieren und ausführen
Grüße
Christian
Früher war alles besser. Und aus Holz!
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
EditorOptions ist eine Unit von Lazarus. Die habe ich gebraucht für mein Einstellungs Dialog. Das ist im Prinzip eine Kopie. Die kannst du rauß nehmen. Die hast du auch. Die liegt in deinem Lazarus Verzeichnis unter lcl/ide
Bevor der Falsche Eindruck besteht: Soruce-Code teile kommen nicht alle ausschließlich von mir. Z.B. im OptionsDialog verwende ich sehr viel was ich aus der EditorOptions habe. Das Projekt ist auch noch nicht Fertig. Erst letzten habe ich wieder eine Aufgabe abgeschlossen. Ich denke aber als Schablone dürfte es schon ausreichen.
Es könnte sein das noch mehr Dateien geöffnet sind, die zu Lazarus gehören. Oft schaue ich in den Lazarus-Sorucecode rein um Probleme zu lösen oder um Ideen zu bekommen.
Bevor der Falsche Eindruck besteht: Soruce-Code teile kommen nicht alle ausschließlich von mir. Z.B. im OptionsDialog verwende ich sehr viel was ich aus der EditorOptions habe. Das Projekt ist auch noch nicht Fertig. Erst letzten habe ich wieder eine Aufgabe abgeschlossen. Ich denke aber als Schablone dürfte es schon ausreichen.
Es könnte sein das noch mehr Dateien geöffnet sind, die zu Lazarus gehören. Oft schaue ich in den Lazarus-Sorucecode rein um Probleme zu lösen oder um Ideen zu bekommen.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit
Danke. Hab das Problem gefunden. In Deinem Projekt waren natürlich die Pfade von Deiner Linuxumgebung gespeichert.pluto hat geschrieben:EditorOptions ist eine Unit von Lazarus.
Die gibt's auf meinem Windows nicht.
Jetzt kann ich's kompilieren und ausführen.
Grüße
Christian
Früher war alles besser. Und aus Holz!