Einzelnen Beitrag anzeigen

Benutzerbild von BeBored
BeBored

Registriert seit: 2. Jun 2004
Ort: Cremlingen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DrawCell vom Drawgrid belegt ganzes Programm

  Alt 17. Jun 2010, 07:39
Delphi-Version: 2007
Hallo,

ich sitze mal wieder an meinem Bahnprogramm und möchte eine wichtige Optimierung durchführen und hoffe ihr könnt mir helfen.
Ich zeichne folgt auf ein Drawgrid:
Delphi-Quellcode:
procedure TfrmMain.gridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  I: Integer;
begin
  for I := Low(GleisArray) to High(GleisArray) do
  begin
    if GleisArray[i].Art = 'Textthen
      Gleis.Text(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Feldtext);
    if GleisArray[i].Art = 'Geradethen
      Gleis.Gerade(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Gesetzt);
    if GleisArray[i].Art = 'WeicheOLthen
      Gleis.WeicheOL(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Gesetzt);
    if GleisArray[i].Art = 'WeicheOLGthen
      Gleis.WeicheOLG(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Gesetzt);
    if GleisArray[i].Art = 'WeicheORthen
      Gleis.WeicheOR(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Gesetzt);
    if GleisArray[i].Art = 'WeicheORGthen
      Gleis.WeicheORG(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Gesetzt);
    if GleisArray[i].Art = 'WeicheULthen
      Gleis.WeicheUL(GleisArray[i].x, GleisArray[i].y, GleisArray[i].Gesetzt);
// und so weiter...
GleisArray ist ein Record
Delphi-Quellcode:
TGleisrecord = packed record
    x: Integer;
    y: Integer;
    Feldtext: string;
    Art: string;
    Gesetzt: Boolean;
  end;
und wird so gefüllt:
Delphi-Quellcode:
while not DataModule1.query2.Eof do
  begin
    {==============================================================================
    Das Array wird mit den einzelnen Feldern eingelesen.
    Das Array beginnt bei 1, da es nachher einfacher ist beim auslesen.
    ==============================================================================}

    GleisArray[i].x := DataModule1.query2.FieldByName('x').AsInteger;
    GleisArray[i].y := DataModule1.query2.FieldByName('y').AsInteger;
    GleisArray[i].Feldtext := DataModule1.query2.FieldByName('Feldtext').AsString;
    GleisArray[i].Art := DataModule1.query2.FieldByName('Art').AsString;
    GleisArray[i].Gesetzt := DataModule1.query2.FieldByName('Gesetzt').AsBoolean;
    Inc(i);
    {==============================================================================
    Weiter zum nächsten Datensatz.
    ==============================================================================}

    DataModule1.query2.Next;
Die Klasse Gleis beinhaltet die Bitmaps. Es ist alles als Bitmap vorhanden, ausser dem Text der wird "live" erzeugt.
Delphi-Quellcode:
// Die Gleise
procedure TGleisPic.DiagonalLinks(Spalte, Reihe: Integer; Gruen: Boolean);
var
  p: TRect;
begin
  p := Can.CellRect(Spalte, Reihe);
  if Gruen then
    BitBlt(Can.Canvas.Handle, p.Left, p.Top, p.Right - p.Left, p.Bottom - p.Top, Gleise.DiagonalLinks_G.Canvas.Handle, 0, 0, SRCCOPY)
  else
    BitBlt(Can.Canvas.Handle, p.Left, p.Top, p.Right - p.Left, p.Bottom - p.Top, Gleise.DiagonalLinks_S.Canvas.Handle, 0, 0, SRCCOPY);
end;

// und der Text
procedure TGleisPic.Text(Spalte, Reihe: Integer; Text: string);
var
  p: TRect;
begin
  SetBkMode(Can.Canvas.Handle, OPAQUE);
  Can.Canvas.Font.Color := clBlack;
  Can.Canvas.Font.Size := 7;
  Can.Canvas.Font.Style := [];
  Can.Canvas.Font.Name := 'Arial';
  p := Can.CellRect(Spalte, Reihe);
  Can.Canvas.TextOut(p.Left + 5, p.Top, Text);
end;
Das Bild wird auch fix gezeichnet, aber so schnell hintereinander das die gesammte Anwendung völlig belegt ist.
Ich hatte das ganze auch mit ProcessMessages versucht, aber dann ist das Programm sehr anfällig für Abstürze.

Hat jemand einen Vorschlag wie ich das ganze optimieren oder vielleicht ganz anders angehen könnte?
Matthias
Wer nichts wagt der nichts verliert.
  Mit Zitat antworten Zitat