![]() |
TImage überschreiben
Hey!
Ich habe in meinem Formular ein TImage definiert. Dort lasse ich dann über meine Unit Ausgabe verschiedene Grafiken anzeigen. Wenn ich auf den Menüpunkt ändern gehe, kann ich auch andere Grafiken aufrufen (PAusgabe)
Delphi-Quellcode:
Allerdings schreibt er mir dann die Grafiken übereinander. Habe es schon mit refresh versucht, aber leider ohne Erfolg. Irgendeine Idee?
// Detailansicht verfügbar machen
BildGroesse(3); if TJubilaeum then PAusgabe(1, main.MainWindow.Bild.Canvas, 'B', 'J') else if TTeilwert then PAusgabe(1, main.MainWindow.Bild.Canvas, 'B', 'T') else if TIAS then PAusgabe(1, main.MainWindow.Bild.Canvas, 'B', 'I'); |
Re: TImage überschreiben
Da meine Glaskugel leider nicht hinter die bizarren Prozeduraufrufe sehen kann, wäre es schön, die definitionen dieser prozeduren zu sehen.
|
Re: TImage überschreiben
nicht?! wie schade...
Delphi-Quellcode:
procedure BildGroesse(Seitenzahl: Integer);
procedure PAusgabe( copies: integer; // Anzahl Ausdrucke target:tcanvas; // target : entweder bild.canvas Ausgabe // oder printer.canvas targetStr: Char; // targetstr : entweder 'B' für Bildschirmausgabe // oder 'D' für Drucker Ausgabe: char); // : entweder T für Teilwertausgabe // oder J für Jubiläumsausgabe // oder I für IASausgabe |
Re: TImage überschreiben
Hi,
ja, dein Problem ist offensichtlich, der Fehler steckt in der Unit2 in Zeile 93837. Falls nicht, sind hier wohl wenige gut ohne ihre Glaskugel. Was meinst du denn, was jmd. mit dem von dir geposteten Code anfangen kann? Vielleicht bist du aber auch einfach der eine, der gut Hellsieht? Kannst du mir bei meinem Problem helfen? Wäre echt nett! Gruß Der Unwissende |
Re: TImage überschreiben
Will heißen ... man müßte wissen was die Funktionen machen, also was für Code in denen drinsteckt.
(wenn diese natürlich zu einem größeren "bekannten" Projwekt gehören würde auch der Name des Projekts helfen und eventuell wo man es finden kann. |
Re: TImage überschreiben
ist ein kleineres Projekt :wink:
sorry, war etwas neben der Kappe gestern! also: 1. Formular MainWindow mit TImage und Menü - darunter eben auch der Menüpunkt ändern, der folgenden Quellcode enthält:
Delphi-Quellcode:
2. Forumal Eingabe - hier werden Daten eingegeben, die dann berechnet werden (in ziemlich vielen anderen Units, aber das ist ja nicht das Problem)
procedure TMainWindow.AendernClick(Sender: TObject);
begin if Eingabe.ShowModal = mrOK then begin // Detailansicht verfügbar machen BildGroesse(3); if TJubilaeum then PAusgabe(1, main.MainWindow.Bild.Canvas, 'B', 'J') else if TTeilwert then PAusgabe(1, main.MainWindow.Bild.Canvas, 'B', 'T') else if TIAS then PAusgabe(1, main.MainWindow.Bild.Canvas, 'B', 'I'); // Menüeinträge verfügbar machen Bearbeiten.Enabled:=True; Drucken.Enabled:=True; end; end; 3. Die Grafiken werden wie schon gesagt in der Unit Ausgabe initialisiert. Hier mal der gekürzte Quellcode:
Delphi-Quellcode:
Ich weiß, vielleicht würde es über einen Report besser/leichter gehen, aber ich musste den Quellcode von meinem Vorgänger übernehmen...
{******************************************************************************}
{ PROCEDURE : BildGroesse } { } { AUFGABE: legt die Höhe des Bild.Canvas auf die angegebene Anzahl Seiten fest } {******************************************************************************} procedure BildGroesse(Seitenzahl: Integer); begin with Mainwindow do begin bild.visible := true; bild.Align := alclient; bild.align:= alnone; bild.Left := 20; bild.width := 2*round(bild.Height*0.7); bild.height := 2 * Seitenzahl*bild.Height; myprint.pagex := mainwindow.Bild.Width; myprint.pagey := mainwindow.Bild.Height div Seitenzahl; diff := 0; end; end; {********************************************************} { PROCEDURE : PAusgabe } { } { AUFGABE: erzeugt die Bildschirmausgabe sowie den Druck } {********************************************************} procedure PAusgabe( copies: integer; // Anzahl Ausdrucke target:tcanvas; // target : entweder bild.canvas // oder printer.canvas targetStr: Char; // targetstr : entweder 'B' für Bildschirmausgabe // oder 'D' für Drucker Ausgabe: char); // Ausgabe : entweder T für Teilwertausgabe // oder J für Jubiläumsausgabe label LTeilwert, LEnde, LJubilaeum1, LJubilaeum2, LJubilaeum3, LJubilaeum4, LJubilaeum5, LJubilaeum6, LJubilaeum7, LIAS; var copycount,i,p,pmax,ep : Integer; lf : logfont; begin with mainwindow do begin for copycount := 1 to Copies do begin myprint.target:=target; if targetstr = 'D' then begin Printer.Title := 'Teilwert v. 4.0'; myprint.pagex := printer.pagewidth; myprint.pagey := printer.pageheight; Diff := 0; p:=0; // 83 ist Druckendalter! pmax:=trunc((83-AngDaten.PersDaten.PersX-p*22) / 22); if (83-AngDaten.PersDaten.PersX-p*22) mod 22 > 0 then pmax:=pmax+1; printer.BeginDoc; end; // if targetstr = 'D' then lf.lfCharSet := DEFAULT_CHARSET; lf.lfFaceName := 'Arial'; target.Font.Handle := CreateFontIndirect(lf); target.Font.Color := clblack; if targetstr <> 'D' then BildGroesse(2); if Ausgabe = 'T' then GoTo LTeilwert //.... {*********************** Beginn LTeilwert ***********************} LTeilwert: target.Font.Style:= []; lf.lfFaceName := 'Arial Narrow'; target.Font.Handle := CreateFontIndirect(lf); // entsprechend zu druckende Zeilen if pmax > p+1 then ep := 22 else ep := 83-AngDaten.PersDaten.PersX-p*22-1; p:=p+1; // Überschrift Dokument target.Font.Style:= [fsBold,fsUnderline]; setfont(16); prntext(3,1.5,'VERSICHERUNGSMATHEMATISCHE BERECHNUNGEN',0,0); target.Font.Style:= [fsBold]; setfont(11); prntext(5,2.3,'Richttafeln 2005 von Dr. Klaus Heubeck',0,0); with AngDaten.EinDaten do begin setfont(10); prntext(3,3,'Firma:',0,0); prntext(6,3,EinFirma,0,0); prntext(3,3.5,'Personalnummer:',0,0); prntext(6,3.5,EinPersNr,0,0); //... // beim Ausdrucken Datum sowie Seitenzahlen angeben if targetstr = 'D' then begin target.font.Pitch := fpDefault; //prnline(0,28,maxx,28); SetFont(12); prntext(0,28.5,datetostr(date),0,0); prntext(18,28.5,'Seite '+inttostr(p)+'/'+inttostr(pmax),0,0); // neue Seite ausdrucken wenn notwendig if p < pmax then begin Printer.NewPage; goto LTeilwert; end; // if p < pmax then end; // if targetstr = 'D' then Goto LEnde; {************************* Beginn LEnde *************************} LEnde: if targetstr = 'D' then if printer.Printing = true then printer.enddoc; if Ausgabe = 'J' then if targetstr <> 'B' then BildGroesse(7); end; end; end; jetzt klarer? |
Re: TImage überschreiben
Ok, etwas klarer ;-)
Was mir jetzt nicht mehr ganz so klar ist, ist worauf sich deine Frage bezieht, sorry. Also du sagst, dass da mehrere Grafiken übereinander geschrieben werden. Soweit, so klar. Doch wann genau? Was möchtest du konkret machen was schief geht? # Möchtest du mehrere Seiten erzeugen und der schreibt alles auf eine? Oder möchtest du mehrere Grafiken auf den selben Canvas drucken (z.B. dem einer Bitmap) und die neu "gedruckte" liegt einfach über der alten? Falls du letzteres meinst, wenn du die Größe deines Canvas kennst, kannst du den einfach mal löschen (zeichne ein gefülltes Rechteck in der Hintergrundfarbe des Canvas, bevor du die Grafik raufsetzt). Würde denken, dass du das jetzt meinst (nach dem ersten Post). Gruß Der Unwissende |
Re: TImage überschreiben
also, im Formular Eingabe gibt es 3 verschiedene Detailansichten - die, nachdem man im Hauptfenster auf Ändern geht, abwechselnd gewählt werden können.
Und wenn ich dann von der einen auf die andere wechsele, schreibt er beide Sachen sozusagen übereinander, so dass ich beide Tabellen sehe. also wie du schon geschrieben hast: mehrere Grafiken auf ein Canvas. also müsste ich dann beim Menüpunkt ändern, ein Rechteck zeichnen lassen - und eine bereits implementierte Methode gibt es dafür nicht? Ich meine, das fällt einem ja als erstes ein, aber gibt es da nichts schöneres? :-D |
Re: TImage überschreiben
Na ja, was verstehst du denn unter schöner? Ist halt die Funktionalität eines Canvas. Ich meine es wäre ärgerlicher, wenn du nicht übereinander zeichnen könntest. In einigen Situationen wirst du genau das brauchen, würde da jedes mal deine Fläche gelöscht werden...
Aber eine fertige Funktion gibt es ja (nahezu), es gibt die Funktion, die dir ein Rechteck zeichnet (gefüllt) und die Funktion, die dir erlaubt die Farbe festzulegen. Mehr ist nicht nötig. Und die dazu benötigten 2-3 Zeilen in eine eigene Methode zu packen sollte doch wohl kein Problem sein? |
Re: TImage überschreiben
ich hätte halt erwartet, dass es eine Methode gibt, die sozusagen den Anfangszustand des Image wieder herstellt. aber dann werde ich das wohl so machen.
Danke! :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 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