AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PageControl Canvas kopieren

Ein Thema von G-Baumstamm · begonnen am 12. Feb 2011 · letzter Beitrag vom 16. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#1

PageControl Canvas kopieren

  Alt 12. Feb 2011, 12:43
Delphi-Version: 5
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 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
Daniel NR
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: PageControl Canvas kopieren

  Alt 12. Feb 2011, 16:34
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: PageControl Canvas kopieren

  Alt 12. Feb 2011, 23:08
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
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: PageControl Canvas kopieren

  Alt 14. Feb 2011, 11:16
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 ... ^^
Daniel NR
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: PageControl Canvas kopieren

  Alt 14. Feb 2011, 14:20
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?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: PageControl Canvas kopieren

  Alt 15. Feb 2011, 16:49
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 ...
Daniel NR
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: PageControl Canvas kopieren

  Alt 15. Feb 2011, 18:03
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...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: PageControl Canvas kopieren

  Alt 15. Feb 2011, 19:28
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
Daniel NR
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: PageControl Canvas kopieren

  Alt 15. Feb 2011, 19:34
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: PageControl Canvas kopieren

  Alt 16. Feb 2011, 15:04
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
Daniel NR
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
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