Verständnisfrage: Einfügen von TabSheets zur Laufzeit

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
AlterMann
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

Beitrag von AlterMann »

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
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit

Beitrag von theo »

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.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit

Beitrag von DiBo33 »

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

AlterMann
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

Beitrag von AlterMann »

Na, dann werd' ich das einmal versuchen.
Danke.
Früher war alles besser. Und aus Holz!

AlterMann
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

Beitrag von AlterMann »

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;
Auf diese Möglichkeit wurde ich hier im Forum bereits gestossen und hab sie auch schon verwendet.
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;
Aber:
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!

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit

Beitrag von DiBo33 »

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

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;

pluto
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

Beitrag von pluto »

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.
Dateianhänge
plEditor.zip
(326.42 KiB) 74-mal heruntergeladen
MFG
Michael Springwald

AlterMann
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

Beitrag von AlterMann »

@DiBo33:
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!

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Verständnisfrage: Einfügen von TabSheets zur Laufzeit

Beitrag von DiBo33 »

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);

AlterMann
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

Beitrag von AlterMann »

DiBo33 hat geschrieben: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);
Noch so ein Trick und mein Programm wird unleserlich wie Hardcore-C++ Code. :mrgreen:
Danke f. d. Tipp.
Früher war alles besser. Und aus Holz!

AlterMann
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

Beitrag von AlterMann »

@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
Früher war alles besser. Und aus Holz!

pluto
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

Beitrag von pluto »

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.
MFG
Michael Springwald

AlterMann
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

Beitrag von AlterMann »

pluto hat geschrieben:EditorOptions ist eine Unit von Lazarus.
Danke. Hab das Problem gefunden. In Deinem Projekt waren natürlich die Pfade von Deiner Linuxumgebung gespeichert.
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!

Antworten