Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: bild in draw- oder stringgrid laden

  Alt 18. Sep 2008, 16:22
Das Hauptproblem ist zu verstehen, wie das Bild überhaupt in das Grid gelangt.
taaktaak hat schon weiter oben versucht dies zu erklären.

Das Bild wird nicht in das Grid geladen, denn das DrawGrid hat nicht die Möglichkeit Bilder oder überhaupt Daten zu verwalten.

Zuerst benötigt man eine Liste die alle Bilder aufnimmt, die überhaupt angezeigt werden sollen.
Dies kann zum Beispiel eine TImageList sein oder eine TObjectList.
Hier ein kleines Beispiel mit TObjectList:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    {...}
  private
    FBilder: TObjectList;
    procedure AddBild(AFilename: String);
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  {Die Bilderliste erzeugen}
  FBilder := TObjectList.Create;
  AddBild('Bild1.jpg');
  AddBild('Bild2.jpg');
  AddBild('Bild3.jpg');
  {...}
  InitGrid; {wird gleich erklärt}
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  {Die Bilderliste und alle enthaltenen Bilder löschen}
  FBilder.Free;
end;

procedure TForm1.AddBild(AFilename: String);
var
  Bild: TPicture;
begin
  Bild := TPicture.Create;
  try
    Bild.LoadFromFile(AFilename);
    {die Liste übernimmt die Verwaltung der Bilder und ist für die Freigabe
     des Speichers verantwortlich, wenn diese nicht mehr benötigt werden}

    FBilder.Add(Bild);
  except
    Bild.Free;
    {... Fehlermeldung oder ähnliches}
  end;
end;
Dann benötigt man die Information, welches Bild in welcher Zelle angezeigt werden soll.
In diesem Beispiel in einem zweidimensional dynamischen Array abgebildet:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    {...}
  private
    FBilder: TObjectList;
    FCellBild: array of array of TPicture;
    procedure AddBild(AFilename: String);
    procedure InitGrid;
  end;

implementation

procedure TForm1.InitGrid;
var
  x, y: Integer;
begin
  SetLength(FCellBild, DrawGrid.Rowcount);
  for y := 0 to DrawGrid.Rowcount - 1 do
  begin
    SetLength(FCellBild[y], DrawGrid.Colcount);
    {Wir weisen einfach jeder Zelle ein zufälliges Bild aus unserer Liste zu.
    Wichtig: Für das Array werden keine Kopien erzeugt,
     sondern hier wird nur auf die Bilder aus der Liste verwiesen.}

    for x := 0 to DrawGrid.Colcount - 1 do
      FCellBild[y][x] := FBilder[Random(FBilder.Count)] as TPicture;
  end;
end;
Im eigentlichen DrawCell wird von uns nur verlangt eine einzelne Zelle zu zeichnen.
Welches Bild in welche Zelle gehört, haben wir schon vorher festgelegt:

Delphi-Quellcode:
procedure TForm1.DrawGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Bild: TPicture;
begin
  {Das Grid ruft diese Methode für jede Zelle jedesmal auf,
   wenn diese neu gezeichnet werden muss.}

  Bild := FCellBild[ARow][ACol];
  if Assigned(Bild) then
    DrawGrid.Canvas.Draw(Rect.Left, Rect.Top, Bild.Graphic);
end;
  Mit Zitat antworten Zitat