AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TImage überschreiben
Thema durchsuchen
Ansicht
Themen-Optionen

TImage überschreiben

Ein Thema von ksh · begonnen am 4. Jul 2006 · letzter Beitrag vom 5. Jul 2006
Antwort Antwort
ksh
(Gast)

n/a Beiträge
 
#1

TImage überschreiben

  Alt 4. Jul 2006, 15:37
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?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TImage überschreiben

  Alt 4. Jul 2006, 15:54
Da meine Glaskugel leider nicht hinter die bizarren Prozeduraufrufe sehen kann, wäre es schön, die definitionen dieser prozeduren zu sehen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
ksh
(Gast)

n/a Beiträge
 
#3

Re: TImage überschreiben

  Alt 4. Jul 2006, 16:43
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
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: TImage überschreiben

  Alt 4. Jul 2006, 16:54
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: TImage überschreiben

  Alt 4. Jul 2006, 17:13
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.
$2B or not $2B
  Mit Zitat antworten Zitat
ksh
(Gast)

n/a Beiträge
 
#6

Re: TImage überschreiben

  Alt 5. Jul 2006, 09:08
ist ein kleineres Projekt

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 = 'Dthen
        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 <> 'Dthen BildGroesse(2);

      if Ausgabe = 'Tthen
        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 = 'Dthen
        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 = 'Dthen if printer.Printing = true then printer.enddoc;
        if Ausgabe = 'Jthen
          if targetstr <> 'Bthen 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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: TImage überschreiben

  Alt 5. Jul 2006, 09:26
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
  Mit Zitat antworten Zitat
ksh
(Gast)

n/a Beiträge
 
#8

Re: TImage überschreiben

  Alt 5. Jul 2006, 09:50
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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#9

Re: TImage überschreiben

  Alt 5. Jul 2006, 10:18
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?
  Mit Zitat antworten Zitat
ksh
(Gast)

n/a Beiträge
 
#10

Re: TImage überschreiben

  Alt 5. Jul 2006, 10:27
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!
  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 06:31 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