Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TImage überschreiben (https://www.delphipraxis.net/72646-timage-ueberschreiben.html)

ksh 4. Jul 2006 14:37


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:
    // 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');
Allerdings schreibt er mir dann die Grafiken übereinander. Habe es schon mit refresh versucht, aber leider ohne Erfolg. Irgendeine Idee?

DGL-luke 4. Jul 2006 14:54

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.

ksh 4. Jul 2006 15:43

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

Der_Unwissende 4. Jul 2006 15:54

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

himitsu 4. Jul 2006 16:13

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.

ksh 5. Jul 2006 08:08

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:
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;
2. Forumal Eingabe - hier werden Daten eingegeben, die dann berechnet werden (in ziemlich vielen anderen Units, aber das ist ja nicht das Problem)
3. Die Grafiken werden wie schon gesagt in der Unit Ausgabe initialisiert. Hier mal der gekürzte Quellcode:
Delphi-Quellcode:
{******************************************************************************}
{ 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;
Ich weiß, vielleicht würde es über einen Report besser/leichter gehen, aber ich musste den Quellcode von meinem Vorgänger übernehmen...
jetzt klarer?

Der_Unwissende 5. Jul 2006 08:26

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

ksh 5. Jul 2006 08:50

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

Der_Unwissende 5. Jul 2006 09:18

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?

ksh 5. Jul 2006 09:27

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