![]() |
Probleme mit einem Formular
Hallo, ich bin neu hier und programmiere nur für mich privat.
nun zu meinem problem: ich habe eine druckvorschau (wie von doberenz und kowalski beschrieben) auf ein formular (form2) gelegt. wenn ich dieses formular öffne, ist die druckvorschau vorhanden. wenn ich es dann schließe und wieder öffne, bleibt die druckvorschau weiss. ich zeige das formulat mit form2.show an. zudem habe ich festgestellt, dass die proceduren form2.create und form2.resize nicht mehr durchlaufen werden. hängt es vielleicht damit zusammen ? weiss jemand rat ? vielen dank im vorraus |
AW: Probleme mit einem Formular
Hallo,
und ein herzliches Willkommen in der DP. :dp: Zitat:
Zitat:
Lange Rede, kurzer Sinn: Poste mal etwas Code und Dir wird hier sicher schnell und kompetent geholfen. Gruß |
AW: Probleme mit einem Formular
unit anzeige;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,unit1, StdCtrls, Buttons, ExtCtrls,printers; type TForm2 = class(TForm) Shape1: TShape; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; blatt:tcanvas; dc : hdc; druckbreite,druckhoehe:integer; panelx:twincontrol; mmpropixely,mmpropixelx:single; implementation {$R *.dfm} procedure blattanpassen; var prnxy,formxy:single; dx,dy,x,y : integer; blattbreite,blatthoehe : integer; scale : single; xofs,yofs : single; begin mmpropixelx :=25.4/getdevicecaps(printer.handle,logpixelsx); mmpropixely :=25.4/getdevicecaps(printer.handle,logpixelsy); blattbreite:=round (getdevicecaps(printer.Handle,physicalwidth)*mmpro pixelx); blatthoehe:=round (getdevicecaps(printer.Handle,physicalheight)*mmpr opixely); xofs:=round(getdevicecaps(printer.Handle,physicalo ffsetx)*mmpropixelx); yofs:=round(getdevicecaps(printer.Handle,physicalo ffsety)*mmpropixely); druckbreite:= getdevicecaps(printer.Handle,horzsize); druckhoehe:= getdevicecaps(printer.Handle,vertsize); y:=35; x:=10; formxy:=( form2.ClientWidth -x) / (form2.ClientHeight -y); prnxy := blattbreite / blatthoehe; if formxy < prnxy then begin dx:=form2.ClientWidth-20; dy:=round(dx/prnxy); y:=round((form2.ClientHeight /2+8) - (dy/2)); end else begin dy:=form2.ClientHeight -y - 10; dx:=round(dy * prnxy); x:=round((form2.ClientWidth / 2) - (dx /2)); end; form2.shape1.setbounds(x,y,dx,dy); scale:=dy/blatthoehe; panelx.SetBounds(x+round(xofs*scale),y+round(yofs* scale), round(druckbreite*scale),round(druckhoehe*scale)); setmapmode(blatt.Handle,mm_anisotropic); setviewportextex(blatt.Handle,dx,dy,nil); setwindowextex(blatt.Handle,druckbreite*10,-druckhoehe*10,nil); setbkmode(blatt.Handle,transparent); blatt.Brush.Style:=bssolid; blatt.Brush.Color:=clwhite; blatt.Pen.Color:=clblack; blatt.FillRect(bounds(0,0,druckbreite*10,-druckhoehe*10)); end; {of blattanpassen} procedure ausgabe(ziel:tcanvas); var i,l,breite,hoehe:integer; s,t:string; with ziel do begin font.Height:=50; font.Name:='Arial'; settextalign(handle,ta_left+ta_top); breite:=druckbreite*10; hoehe:=druckhoehe*10; textout(1150,(i*-53)-120,'Festplatte: '+s); end; end; {end of ausgabe} procedure TForm2.BitBtn2Click(Sender: TObject); begin if seite=anz_seiten then exit; if seite<anz_seiten then seite:=seite+1; blattanpassen; ausgabe(blatt); end; procedure TForm2.BitBtn3Click(Sender: TObject); begin if seite=1 then exit; if seite>1 then seite:=seite-1; blattanpassen; ausgabe(blatt); end; procedure TForm2.FormResize(Sender: TObject); begin blattanpassen; ausgabe(blatt); end; procedure TForm2.FormShow(Sender: TObject); var begin {diese 5 zeilen standen mal in form2.create} panelx:=twincontrol.Create(self); panelx.Parent:=form2; blatt:=tcanvas.Create; blatt.Handle:=getdc(panelx.Handle); setmapmode(blatt.Handle,mm_anisotropic); blattanpassen; ausgabe(blatt); end; end. das hier ist das wesentliche , ich gebe natürlich noch mehr dinge mit textout aus. ich habe nun die 5 zeilen in show genommen. zur erklärung muss ich sagen, das ich mehrer seiten ausgeben kann. dies geschieht durch einen button , der dann die seite erhöht und die nächste wird ausgeben. nun passiert folgendes: nachdem ich das formulag geschlossen habe, und wieder geöffnet habe, gibt es eine weisse fläche über die ein grauer belag liegt. wenn ich dann die nächste seite anzeige, ist wieder alles in ordnung und ich kann durchblättern. natürlich bin ich dann zunächst auf der seite 2, die seite 1 wird nicht angezeigt. wenn ich dann mit dem button (down) blättere, kann ich mir die erste seite ansehen. ist schon eigenartig. |
AW: Probleme mit einem Formular
Auch von mir ein herzliches Willkommen in der DP :dp:,
sei doch bitte so nett und editiere Deinen Beitrag noch einmal. Für Delphi-Quellcode gibt es spezielle Tags, Du kannst diese setzen, indem Du den Code markierst und dann im Beitragseditor die "Helm"-Schaltfläche drückst. Formatierter Code ist um Längen besser zu lesen und damit nachzuvollziehen. |
AW: Probleme mit einem Formular
Hallo,
Zitat:
Um DeddyH zu konkretisieren: Anmelden, den eigenen Beitrag suchen, in der Fusszeile auf die Schaltfläche Bearbeiten klicken und dann Quellcode innerhalb der [DELPHI ][/DELPHI ]-Tags (Helm-Symbol in den Shortcuts) einfügen. Ansonsten könnte folgendes Dein Problem vielleicht lösen:
Delphi-Quellcode:
TForm2 = class(TForm)
procedure FormPaint(Sender: TObject); private FMustRepaint : Boolean; end; procedure TForm5.FormCreate(Sender: TObject); begin FMustRepaint := True end; procedure TForm2.FormPaint(Sender: TObject); begin if FMustRepaint then begin blattanpassen; ausgabe(blatt); FMustRepaint := False end; end; procedure TForm2.FormShow(Sender: TObject); begin FMustRepaint := True end; Zitat:
Gruß |
AW: Probleme mit einem Formular
Hallo,
vergiss bitte das Gesagte bezüglich FMustRepaint; das ist nicht nötig.
Delphi-Quellcode:
Sollte es tun.
procedure TForm2.FormPaint(Sender: TObject);
begin blattanpassen; ausgabe(blatt) end; Gruß |
AW: Probleme mit einem Formular
vielen dank für die antworten.
eine frage erstmal zum text editieren.da er gekürzt ist, liegt er jetzt als text-datei vor. damit schein die hervorhebung nicht zu gelingen oder mach ich da was falsch. ich hab die zeilen , wie volker beschrieben, in formpaint eingefügt. damit ist das problem behoben, aber ein neues tut sich auf. immer wenn ich dann mit dem mauszeiger über das panel gehe, auf dem die schaltbuttons liegen, fängt der text auf dem blatt an zu zittern, wird wahrscheinlich immer neu gezeichnet. das ist natürlich auch nicht schön. vielleicht findet ihr dafür auch eine lösung. habe nochmal genauer hingesehen, der text auf dem canvas wird immer beim aufrufen der form neugezeichnet, das könnte daran liegen, das ich das fenster automatisch vergrößere, aber immer wenn ich mit der maus über die buttons auf dem panel gehe wird wieder neu gezeichnet , maus über panel und form ist alles ok wenn ich in der pocedure formpaint blattanpassen weglasse, wird nicht mehr neu gezeichnet, aber der text sieht unschön (wahrscheinlich nicht skaliert) aus. auch habe ich festgestellt, dass das panel und die buttons beim skalieren der form irgendwie nicht richtig mitskalieren. sie werden dann von dem blatt teilweise überdeckt. vielen dank im vorraus. |
AW: Probleme mit einem Formular
Delphi-Quellcode:
unit anzeige;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,unit1, StdCtrls, Buttons, ExtCtrls,printers; type TForm2 = class(TForm) Shape1: TShape; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; blatt:tcanvas; dc : hdc; druckbreite,druckhoehe:integer; panelx:twincontrol; mmpropixely,mmpropixelx:single; implementation {$R *.dfm} procedure blattanpassen; var prnxy,formxy:single; dx,dy,x,y : integer; blattbreite,blatthoehe : integer; scale : single; xofs,yofs : single; begin mmpropixelx :=25.4/getdevicecaps(printer.handle,logpixelsx); mmpropixely :=25.4/getdevicecaps(printer.handle,logpixelsy); blattbreite:=round (getdevicecaps(printer.Handle,physicalwidth)*mmpropixelx); blatthoehe:=round (getdevicecaps(printer.Handle,physicalheight)*mmpropixely); xofs:=round(getdevicecaps(printer.Handle,physicaloffsetx)*mmpropixelx); yofs:=round(getdevicecaps(printer.Handle,physicaloffsety)*mmpropixely); druckbreite:= getdevicecaps(printer.Handle,horzsize); druckhoehe:= getdevicecaps(printer.Handle,vertsize); y:=35; x:=10; formxy:=( form2.ClientWidth -x) / (form2.ClientHeight -y); prnxy := blattbreite / blatthoehe; if formxy < prnxy then begin dx:=form2.ClientWidth-20; dy:=round(dx/prnxy); y:=round((form2.ClientHeight /2+8) - (dy/2)); end else begin dy:=form2.ClientHeight -y - 10; dx:=round(dy * prnxy); x:=round((form2.ClientWidth / 2) - (dx /2)); end; form2.shape1.setbounds(x,y,dx,dy); scale:=dy/blatthoehe; panelx.SetBounds(x+round(xofs*scale),y+round(yofs*scale), round(druckbreite*scale),round(druckhoehe*scale)); setmapmode(blatt.Handle,mm_anisotropic); setviewportextex(blatt.Handle,dx,dy,nil); setwindowextex(blatt.Handle,druckbreite*10,-druckhoehe*10,nil); setbkmode(blatt.Handle,transparent); blatt.Brush.Style:=bssolid; blatt.Brush.Color:=clwhite; blatt.Pen.Color:=clblack; blatt.FillRect(bounds(0,0,druckbreite*10,-druckhoehe*10)); end; {of blattanpassen} procedure ausgabe(ziel:tcanvas); var i,l,breite,hoehe:integer; s,t:string; with ziel do begin font.Height:=50; font.Name:='Arial'; settextalign(handle,ta_left+ta_top); breite:=druckbreite*10; hoehe:=druckhoehe*10; textout(1150,(i*-53)-120,'Festplatte: '+s); end; end; {end of ausgabe} procedure TForm2.BitBtn2Click(Sender: TObject); begin if seite=anz_seiten then exit; if seite<anz_seiten then seite:=seite+1; blattanpassen; ausgabe(blatt); end; procedure TForm2.BitBtn3Click(Sender: TObject); begin if seite=1 then exit; if seite>1 then seite:=seite-1; blattanpassen; ausgabe(blatt); end; procedure TForm2.FormResize(Sender: TObject); begin blattanpassen; ausgabe(blatt); end; procedure TForm2.FormShow(Sender: TObject); var begin {diese 5 zeilen standen mal in form2.create} panelx:=twincontrol.Create(self); panelx.Parent:=form2; blatt:=tcanvas.Create; blatt.Handle:=getdc(panelx.Handle); setmapmode(blatt.Handle,mm_anisotropic); blattanpassen; ausgabe(blatt); end; end. |
AW: Probleme mit einem Formular
vielen dank für eure antworten,
habe das problem gelöst, in dem ich die anweisungen in der paint - procedure nur dann auslöse, wenn die form2 von form1 aus geöffnet wird. dadurch wird das neuzeichnen unterbunden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 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-2025 by Thomas Breitkreuz