AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit einem Formular

Ein Thema von Helmi47 · begonnen am 31. Jan 2013 · letzter Beitrag vom 1. Feb 2013
Antwort Antwort
Helmi47

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

Probleme mit einem Formular

  Alt 31. Jan 2013, 20:07
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
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Probleme mit einem Formular

  Alt 31. Jan 2013, 22:16
Hallo,

und ein herzliches Willkommen in der DP.

Zitat:
programmiere nur für mich privat
Ist doch ein toller Zeitvertreib

Zitat:
ich habe eine druckvorschau (wie von doberenz und kowalski beschrieben) auf ein formular (form2) gelegt [...]
Leider hat nicht jeder von uns das Kochbuch der beiden Autoren im Bücherregal stehen. Ich kann daher leider nicht nachvollziehen was die Herren in Sachen Druckvorschau geschrieben haben. So kann ich also nur im Nebel stochern: Es sieht so aus, als würdest Du Dir Dein Formular automatisch erzeugen lassen, mittels Menüpunkt o. ä. dann zur Anzeige bringen, um es dann über die [X]-Schaltfläche zu schließen. Ein weiteres form2.Show wird dann kein FormCreate Event auslösen, denn es wurde bereits erzeugt; auch ein FormResize Event beim Anzeigen zu triggern ist nun nicht mehr nötig, denn das Form kennt ja bereits seine Größe. Was nun in FormCreate bzw. FormResize so an Code vorhanden ist, und in wie weit der die Druckvorschau beeinflusst, tja da gibt die Glaskugel leider nichts mehr her.
Lange Rede, kurzer Sinn: Poste mal etwas Code und Dir wird hier sicher schnell und kompetent geholfen.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Probleme mit einem Formular

  Alt 31. Jan 2013, 23:51
Auch von mir ein herzliches Willkommen in der 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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#5

AW: Probleme mit einem Formular

  Alt 1. Feb 2013, 00:52
Hallo,

Zitat:
sei doch bitte so nett und editiere Deinen Beitrag noch einmal.
Ja, das wäre sehr nett; sonst bekommt man noch Augenkrebs
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:
{diese 5 zeilen standen mal in form2.create}
Und diese 5 Zeilen wieder ins FormCreate

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#6

AW: Probleme mit einem Formular

  Alt 1. Feb 2013, 01:22
Hallo,

vergiss bitte das Gesagte bezüglich FMustRepaint; das ist nicht nötig.
Delphi-Quellcode:
procedure TForm2.FormPaint(Sender: TObject);
begin
  blattanpassen;
  ausgabe(blatt)
end;
Sollte es tun.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Helmi47

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

AW: Probleme mit einem Formular

  Alt 1. Feb 2013, 08:15
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.

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

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

AW: Probleme mit einem Formular

  Alt 1. Feb 2013, 08:35
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.
  Mit Zitat antworten Zitat
Helmi47

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

AW: Probleme mit einem Formular

  Alt 1. Feb 2013, 10:22
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:05 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