Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   PageControl Canvas kopieren (https://www.delphipraxis.net/158296-pagecontrol-canvas-kopieren.html)

G-Baumstamm 12. Feb 2011 12:43

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:
Printer.Canvas.CopyRect(Rect(X1,-Y1,X2,-Y2),C,Rect(Left, Top, Left+Width, Top+Height));
übergeben, wobei C vorher über
Delphi-Quellcode:
C := TCanvas.Create;
C.Handle := GetWindowDC(PForm.PageControl.Pages[0].Handle);
erstellt wurde.

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

Bummi 12. Feb 2011 16:34

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;

hans ditter 12. Feb 2011 23:08

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

G-Baumstamm 14. Feb 2011 11:16

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

stahli 14. Feb 2011 14:20

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?

G-Baumstamm 15. Feb 2011 16:49

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

stahli 15. Feb 2011 18:03

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:
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;
Vielleicht hilft Dir das ja als Anregung...

G-Baumstamm 15. Feb 2011 19:28

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

stahli 15. Feb 2011 19:34

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.

G-Baumstamm 16. Feb 2011 15:04

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:
SendMessage(PForm.Handle, WM_SETREDRAW, 0, 0);
SendMessage(EinstForm.Handle, WM_SETREDRAW, 0, 0);
EinstForm.ManualDock(PForm.EinstellungenSheet,nil,alNone);
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 ...

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 08:19 Uhr.
Seite 1 von 2  1 2      

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