![]() |
Delphi-Version: 5
PageControl Canvas kopieren
Hey ;)
Das Problem ist recht einfach: Habe eine PageControl mit 3 Pages, von denen auf der ersten Zeug steht das ich gerne drucken würde. Der Printer kriegt das ganze in der Form
Delphi-Quellcode:
übergeben, wobei C vorher über
Printer.Canvas.CopyRect(Rect(X1,-Y1,X2,-Y2),C,Rect(Left, Top, Left+Width, Top+Height));
Delphi-Quellcode:
erstellt wurde.
C := TCanvas.Create;
C.Handle := GetWindowDC(PForm.PageControl.Pages[0].Handle); Ziel ist es also, den Bereich auf der ersten (!!) Seite zu kopieren, egal auf welcher Seite man grade ist. Leider kopiert er aber immer den Bereich der aktuellen Seite, obwohl ich ja eindeutig den Handle von Pages[0] verwende ... Warum? Was kann ich dagegen machen? LG ;) |
AW: PageControl Canvas kopieren
selbst das hier funktioniert nicht für enthaltene Wincontrols, sofern diese nicht sichtbar sind...
Delphi-Quellcode:
var
i:Integer; begin Pagecontrol1.Pages[0].PaintTo(Image1.Canvas,0,0); for I := 0 to Pagecontrol1.Pages[0].ComponentCount - 1 do begin if Pagecontrol1.Pages[0].Components[i] is TWinControl then begin TWinControl(Pagecontrol1.Pages[0].Components[i]).PaintTo(Image1.Canvas,TWinControl(Pagecontrol1.Pages[0].Components[i]).BoundsRect.Left,TWinControl(Pagecontrol1.Pages[0].Components[i]).BoundsRect.top); end; end; end; |
AW: PageControl Canvas kopieren
also spontan würde ich dir vorschlagen. Dir zu merken auf welcher Seite du gerade bist, dann dein Programm automatisch auf die erste Seite wechselt, den Druckauftrag sendet und dann automatisch wieder zurückblendet.
Das würde dann kurz auflackern wahrscheinlich. Wäre nicht wirkich ein Problem denke ich, gut sieht nicht so schön aus, könnte aber vlt funktionieren. LG, hans ditter |
AW: PageControl Canvas kopieren
Danke für eure Hilfe ;)
Das Problem ist einfach das nicht jede Page der PageControl einen eigenen Canvas hat, sondern alle sich einen teilen und bei jedem Tab-Wechsel die entsprechenden Komponenten gemalt werden. Die Variante mit dem kurzen Tab-Wechsel hatte ich auch schon versucht, da der entsprechende Tab aber ziemlich voll ist brauch er etwa ne halbe Sekunde um ihn vernünftig zu malen, deswegen müsste man vorm zurückwechseln etwas warten. Das sieht dann aber echt nich mehr schön aus, grade deswegen habe ich mich ja nach ner anderen Lösung umgetan ;) Ich habs jetzt so gemacht das ich im OnChanging der PageControl den entsprechenden Bereich in einem Image speichere und ggf dieses dann drucke ... hat den Nachteil das ich Änderungen die ich im 2ten oder dritten Tab mache (welche sich auf die Tabelle im ersten auswirken) erst beim drucken berücksichtigt werden können, wenn ich wieder dahin zurück gewechselt bin. Nicht optimal, aber auch nicht so schlimm ... ^^ |
AW: PageControl Canvas kopieren
Mal als Überlegung:
Du könntest Deine Komponenten für jede Seite auf eignen Formularen definieren und diese zur Laufzeit dynamisch einblenden (statt einem PageControl z.B. auch in einem TabControl). Den Formularinhalt kannst Du dann evtl. leicher drucken? |
AW: PageControl Canvas kopieren
Guter Vorschlag ... hatte ich mir vorher auch schon überlegt, aber wegen "zu umständlich" wieder verworfen.
Werde mich da wohl aber nochmal dran setzten (müssen), falls ich das vernünftig implementiert kriegen sollte würde das Drucken nämlich tatsächlich vernünftig gehen ... ;) |
AW: PageControl Canvas kopieren
Sooo schwierig ist es eigentlich nicht.
So binde ich 3 Formulare in TabSheets ein:
Delphi-Quellcode:
FormGeneral.ManualDock(TabSheetGeneral, nil, alNone);
FormGeneral.Align := alClient; FormGeneral.Show; FormCompetitors.ManualDock(TabSheetCompetitors, nil, alNone); FormCompetitors.Align := alClient; FormCompetitors.Show; FormPlan.ManualDock(TabSheetTournamentPlan, nil, alNone); FormPlan.Align := alClient; FormPlan.Show; So zeige ich existierende Formulare dynamisch in einem TabControl an (wobei das TodFormCtrl eine eigene Komponente ist, die das Formular ggf. "steuert"):
Delphi-Quellcode:
Vielleicht hilft Dir das ja als Anregung...
procedure TFormSetting.odTabControlTournamentsSettingShowRegister(Sender: TObject);
procedure ShowForm(F: TForm); procedure DoShowForm(SF, F: TForm; FC: TodFormCtrl); begin if SF = F then begin SF.ManualDock(odTabControlTournamentsSetting, nil, alNone); SF.Align := alClient; SF.Show; FC.od := odTabControlTournamentsSetting.ActiveOd; if Assigned(SF.OnShow) then SF.OnShow(Self); end else begin FC.od := nil; SF.Close; end; end; begin MemberTournament := odTabControlTournamentsSetting.ActiveOd as TodTournament; DoShowForm(FormSettingMelee, F, FormSettingMelee.odFormCtrl); DoShowForm(FormSettingSwiss, F, FormSettingSwiss.odFormCtrl); DoShowForm(FormSettingGroup, F, FormSettingGroup.odFormCtrl); DoShowForm(FormSettingKo, F, FormSettingKo.odFormCtrl); end; begin if odTournament = nil then ShowForm(nil) else if odTournament.Data_Is_Melee then begin FormSettingMelee.odMelee := odTournament.Melee; ShowForm(FormSettingMelee); end else if odTournament.Data_Is_Swiss then begin ShowForm(FormSettingSwiss); end else if odTournament.Data_Is_Group then begin ShowForm(FormSettingGroup); end else if odTournament.Data_Is_Ko then begin ShowForm(FormSettingKo); end else ShowForm(nil); end; |
AW: PageControl Canvas kopieren
Soviel zum "zu kompliziert". Der 2te Teil erschließt sich mir tatsächlich nicht ganz, aber der erste Teil passt eh besser zu dem was ich brauche, ist extrem simpel und funktioniert super. Danke!
Wenn man weiß wies geht, geht alles viel einfacher :D |
AW: PageControl Canvas kopieren
Freut mich :)
Zum zweiten Teil noch eine kurze Erklärung: Je nach Bedingung A, B, C wird FormA, FormB oder FormC eingedockt und angezeigt und alle anderen Formulare geschlossen. Der Rest (alle od..Controls) initialisiert nur ein paar Daten. |
AW: PageControl Canvas kopieren
Okay, jetzt hab ich den 2ten Teil auch verstanden ;) Btw, deine verwendeten Namen sind ne 1 ... (ich sag nur TFormSetting.odTabControlTournamentsSettingShowReg ister) ^^
Eine letzte Frage hab ich noch: Ich hab das ganze jetzt mit der Fade-Problematik die ich in dem anderen Thread hatte kombiniert, und an einer Stelle macht mich Delphi noch wahnsinnig: Um nach dem Tabwechsel der PageControl die Form einzufaden hab ich sie kurz undockt, eingeblendet und will sie jetzt wieder docken. Da sie aber auch in nicht-angedocktem Zustand genau an der gleichen Stelle liegt sollte der Vorgang des Ent-Dockens und Wieder-Andockens für den Benutzer nicht sichtbar sein. Also quasi Undock --> Tabwechsel --> Einfaden --> Docken. Nach dem Docken zeichnet er die Form allerdings jedes mal wieder neu (macht ja auch Sinn, er kann ja nicht wissen, das diese vorher und nachher genau die gleiche Position hat und das Repaint somit unnötig ist). Und da das nen bisschen dauert, siehts relativ kacke aus ... Leider ist es ihm auch egal, wenn ich vorher mit
Delphi-Quellcode:
versuche das Zeichnen zu verhindern. Je nach dem ob ich das Zeichnen auf beiden Forms blockiere, oder nur auf einer, zeichnet er entweder die entsprechende, grade angedockte Form oder sogar die ganze Anwendung (!) neu. Habs auch schon mit LockWindowUpdate oder Canvas.Lock probiert, aber er malt munter weiter ...
SendMessage(PForm.Handle, WM_SETREDRAW, 0, 0);
SendMessage(EinstForm.Handle, WM_SETREDRAW, 0, 0); EinstForm.ManualDock(PForm.EinstellungenSheet,nil,alNone); So ... ich hoffe das ist nun die engültig letzte Frage zu diesem Thema mit der ich euch nerven muss ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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