Einzelnen Beitrag anzeigen

Helmi47

Registriert seit: 31. Jan 2013
6 Beiträge
 
#3

AW: Probleme mit einem Formular

  Alt 31. Jan 2013, 23:33
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.

Geändert von Helmi47 ( 1. Feb 2013 um 08:35 Uhr)
  Mit Zitat antworten Zitat