![]() |
Inhalt eines dynamisch erstellen Richedits drucken
Hallo,
ich erstelle mir zur Laufzeit ein Pagecontrol mit n-Tabsheets, auf denen jeweils ein Richedit sitzt. Nun möchte ich über einen Button den kompletten Inhalt bzw. die markierten Zeilen des gewählten Richedits drucken. Ich denke, dass ich dazu an den Namen des Richedits herankommen müsste, welches gerade aktiv ist. Habe auch schon ein wenig mit ActiveControl probiert, aber da wird mir dann immer der Drucken-Button angezeigt. Hat jemand eine Idee wie ich das Problem angehen könnte? Wäre sehr dankbar für Anregungen. So wird das TabControl mit den Tabsheets erstellt:
Delphi-Quellcode:
testStands.Sort;
s:=testStands.Count; PageControl1 := TPageControl.Create(Self); PageControl1.Parent := Self; PageControl1.Left:=104; PageControl1.Top:=320; PageControl1.Width:=513; PageControl1.Height:=257; for r := 1 to s do begin TabSheet := TTabSheet.Create(PageControl1); with TabSheet do begin PageControl := PageControl1; Name := 'ts' + IntToStr(r); Caption := testStands[r-1]; RichEdit := TRichEdit.Create(TabSheet); RichEdit.Name:='re'+IntToStr(r); RichEdit.Parent := TabSheet; Richedit.Align := alClient; RichEdit.WordWrap:=false; RichEdit.ScrollBars:=ssBoth; Richedit.Lines.LoadFromFile(appPath+testStands[r-1]+'.tmp'); end; end; Und so will ich drucken:
Delphi-Quellcode:
procedure TForm1.ButtonDruckenClick(Sender: TObject);
begin if (RichEdit1.Lines.Count>0) then begin if PrinterSetupDialog1.Execute then RichEdit1.Print('Einträge'); end else showmessage('Keine Einträge gefunden!'); end; |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Und wo nimmst du das Richedit1 her beim drucken?
Du kannst übrigens mit TComponent.componentcount und TComponent.Component[i] deine Tabsheets durchforsten. (statt Tcomponent entsprechende Komponente einsetzen) |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Du könntest dein RichEdit über den Namen suchen und dabei den Index der aktiven Seite des Pagecontrols benutzen. Etwa so (ungetestet):
Delphi-Quellcode:
TRichEdit(PageControl1.findComponent('re'+inttostr(Pagecontrol1.activepageindex+1)).print;
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Du könntest statt einem Button einen TSpeedbutton verwenden, der kann nämlich nicht den Fokus erhalten, sodass ActiveControl immernoch das Richedit ist.
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Das ist aber auch nicht optimal, denn er hat später vielleicht noch mehr Controls auf jedem Tabsheet. Wenn ichs richtig verstanden habe, will er ja wissen, welches RichEdit gerade angezeigt wird.
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Über die PageControll-Eigenschaft
ActivePageIndex und die vergebenen Namen der TabSheets und RichEdits kann das aktive Element zum Druck verfügbar gemacht werden. |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Sach ich ja! :-D
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Danke für die Beiträge. Über PageControl1.ActivePage.Name bekomme ich schon mal den Namen des aktiven Tabsheets. Da der Name des Richedits der gleiche ist wie der des Tabsheets weiss ich den Namen nun auch. Nur habe ich momentan keinen Plan wie ich auf das Richedit zugreifen kann.
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Du kennst den Owner des Richedits, da du es ja dynamisch erzeugt hast. An diesem Owner rufst du nun FindComponent mit dem Namensstring auf und castest nach TRichedit.
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Habe es mal so eingebaut und compilieren lässt es sich auch. In activePage steht auch der Name des gewählten Tabsheets drin und da der Name des Richedits der gleiche ist müsste es auch passen. Allerdings kommt dann beim Ausführen eine Zugriffsverletzung.
Delphi-Quellcode:
procedure TForm1.ButtonDruckenClick(Sender: TObject);
var activePage : String; begin activePage:= PageControl1.ActivePage.Name; if PrinterSetupDialog1.Execute then TRichEdit (PageControl1.FindComponent(activePage)).print('Hallo'); end; |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Hi,
geht es so?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
procedure FindControl(WinContr: TWinControl); var i : integer; begin for i:= 0 to WinContr.ControlCount- 1 do begin if WinContr.Controls[i] is TRichEdit then showmessage(TRichEdit(WinContr.Controls[i]).Name);//TRichEdit(WinContr.Controls[i]).Print('Hallo'); if WinContr.Controls[i] is TWinControl then FindControl(TWinControl(WinContr.Controls[i])); end; end; begin FindControl(pagecontrol1.ActivePage); end; |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Hallo bitsetter,
danke für die Antwort. Ich denke aber nicht, dass es so geht. Ich habe mehrere Richedits somit will ich eigentlich den Weg über das aktive PageControl-Element gehen. Den Namen des Elements habe ich schon. Nur weiss ich nicht, wie ich auf den Text im Richedit zufreigen kann. Dabei erhalte ich leider momentan noch eine Fehlermeldung. Ich versuche es so:
Delphi-Quellcode:
leider ohne Erfolg. :-(
TRichEdit (PageControl1.FindComponent(activePage)).print('Hallo');
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Zitat:
Zitat:
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Vielleicht habe ich mich auch falsch ausgedrückt. Den Namen des aktiven Tabsheets und somit auch Richedits kenne ich bereits. Nun will ich auf das Richedit zugreifen. Dazu habe ich den Rat von Apollonius befolgt und versucht mit
Delphi-Quellcode:
über Cast nach TRichEdit zu drucken. Es scheint noch ein Fehler beim Casten zu sein. Sieht den jemand?
TRichEdit (PageControl1.FindComponent(activePage)).print('Hallo');
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Wäre es nicht das sinnvollste die erstellten Richedits in einer Liste oder einem Array zu speichern? Damit könnte man sie auch wieder freigeben (ohne sich darauf zu verlassen das der Owner das macht) und man könnte sie über den Index ansprechen. Ist der aktive Index des Pagecontrols dann zum Beispiel 0 brauchst du einfach nur RichEditArray[0] ansprechen.
Ich bin der Meinung FindComponent sollte man nur einsetzen wenn es ohne suche nicht geht. Ansonsten ist es unglücklich programmiert und eine Verschwendung von Ressourcen. Im realen Leben wirft ja auch keiner seinen Autoschlüssel nach hinten über die Schulter irgendwo hinn um ihn später zu suchen. Da legt man den Autoschlüssel auch dort hinn wo man ihn später nicht suchen braucht. |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Ansonsten könntest du beim dynamischen Erstellen des TRichedit den TabSheed.Tag den Pointer übergeben.
Delphi-Quellcode:
Und auslesen kannst du ihn so:
for r := 1 to s do
begin TabSheet := TTabSheet.Create(PageControl1); with TabSheet do begin PageControl := PageControl1; Name := 'ts' + IntToStr(r); Caption := testStands[r-1]; RichEdit := TRichEdit.Create(TabSheet); RichEdit.Name:='re'+IntToStr(r); RichEdit.Parent := TabSheet; TabSheet.Tag:= Cardinal(RichEdit);//<-- ...
Delphi-Quellcode:
Caption:= TRichEdit(Pointer(pagecontrol1.ActivePage.Tag)).Name;//Print
|
Re: Inhalt eines dynamisch erstellen Richedits drucken
Zitat:
Hast Du meinen Vorschlag mal ausprobiert? Der sollte doch genau das machen. (Man muss nur hinten beim print noch den Parameter einfügen. Das hatte ich vergessen) PS: Der letzte Vorschlag von bitsetter ist auch cool. Spart Performance. |
Re: Inhalt eines dynamisch erstellen Richedits drucken
Vielen Dank für die Hinweise. Ich habe nun jedoch eine etwas andere Lösung gewählt. Die ist zwar sicher nicht die schönste aber ich habs zumindest hinbekommen.
1. Ich kenne den Namen des aktiven Richedits (da dieser gleich ist mit dem Tabsheet). 2. Die jeweiligen Inhalte der Richedits befinden sich in Textdatein mit dem Namen des Tabsheets (Tabsheet1.txt usw.) 3. Die Procedure ButtonDrucken.Click() lädt die zum aktiven Tabsheet gehörende Textdatei in ein unsichtbares statisches Richedit (Richedit3). 4. Dieses Richedit wird dann gedruckt mit RichEdit3.print. Ich weiss, dass es sicher elegantere Lösungen gibt. Aber das Programm muss morgen fertig sein und ich hab gleich Feierabend. Ihr habt mir aber trotzdem geholfen und man lernt jedesmal ein bisschen was dazu. Grüße aus Leipzig! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz