Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Stringgrid mit Bildern scrollen (https://www.delphipraxis.net/200580-stringgrid-mit-bildern-scrollen.html)

juelin 4. Mai 2019 14:01

Stringgrid mit Bildern scrollen
 
Hi,
ich habe Delphi XE5.
Ich habe ein Stringgrid in dem ich in Column 1 Bilder anzeige (siehe Code).

var e1bilder: array[1..99999] of string;
var e1bildnum: integer;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var r: TRect;
var u: integer;
var t: string;
begin
if ((ARow = 0) and (ACol = 0)) then
begin
StringGrid1.RowHeights[ARow]:=32;
end else begin
if ((ARow > 0) and (ACol = 0)) then
begin
if ((e1bildnum > 0) and (ARow <= e1bildnum)) then
begin
t:=e1bilder[ARow];
u:=1;
if t <> '' then
begin
try
Image1.Picture.LoadFromFile(t);
except
u:=0;
end;
if u = 1 then
begin
r.Left:=0;
r.Right:=Image1.Picture.Width-1;
r.Top:=0;
r.Bottom:=Image1.Picture.Height-1;
Rect.Left:=0;
Rect.Right:=Image1.Picture.Width-1;
Rect.Top:=32+(ARow-1)*80+ARow;
Rect.Bottom:=Rect.Top+Image1.Picture.Height-1;
StringGrid1.Canvas.CopyRect(Rect, Image1.Canvas, r);
end;
end;
end;
end;
end;
end;

Das klappt auch ganz gut.
Nur wenn mehr Zeilen im Stringgrid sind, als auf dem Bildschirm passen,
und ich nun nach unten scrolle
dann sind die Bilder unterhalb des 1. Bildschimes weg.

Hat da jemand eine Idee.
Es gibt leider kein Ereignis "OnScroll".

Danke und Gruß
Jürgen

p80286 4. Mai 2019 15:06

AW: Stringgrid mit Bildern scrollen
 
Ich hab mir erlaubt das etwas lesbarer zu gestalten:
Delphi-Quellcode:
var e1bilder: array[1..99999] of string;
var e1bildnum: integer;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var r: TRect;
var u: integer;
var t: string;
begin
  if ((ARow = 0) and (ACol = 0)) then
  begin
    StringGrid1.RowHeights[ARow]:=32;
  end else begin
    if ((ARow > 0) and (ACol = 0)) then
    begin
      if ((e1bildnum > 0) and (ARow <= e1bildnum)) then
      begin
        t:=e1bilder[ARow];
        u:=1;
        if t <> '' then
        begin
          try
            Image1.Picture.LoadFromFile(t);
          except
            u:=0;
          end;
          if u = 1 then
          begin
            r.Left:=0;
            r.Right:=Image1.Picture.Width-1;
            r.Top:=0;
            r.Bottom:=Image1.Picture.Height-1;
            Rect.Left:=0;
            Rect.Right:=Image1.Picture.Width-1;
            Rect.Top:=32+(ARow-1)*80+ARow;
            Rect.Bottom:=Rect.Top+Image1.Picture.Height-1;
            StringGrid1.Canvas.CopyRect(Rect, Image1.Canvas, r);
          end;
        end;
      end;
    end;
  end;
end;

juelin 4. Mai 2019 15:22

AW: Stringgrid mit Bildern scrollen
 
Frage ist eigentlich:
wie kriegt man raus ob gescrollt wurde und auf welche Position gescrollt wurde.
Dann könnte ich in TForm1.StringGrid1DrawCell reagieren.

juelin 4. Mai 2019 16:15

AW: Stringgrid mit Bildern scrollen
 
Problem gelöst.
Neuer Code:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var r: TRect;
var u: integer;
var t: string;
var n: integer;
var m: integer;
begin
if ((ARow = 0) and (ACol = 0)) then
begin
StringGrid1.RowHeights[ARow]:=32;
end else begin
if ((ARow > 0) and (ACol = 0)) then
begin
if ((e1bildnum > 0) and (ARow <= e1bildnum)) then
begin
for n:=1 to e1bildnum do
begin
t:=e1bilder[n];
u:=1;
if t <> '' then
begin
try
Image1.Picture.LoadFromFile(t);
except
u:=0;
end;
if u = 1 then
begin
r.Left:=0;
r.Right:=Image1.Picture.Width-1;
r.Top:=0;
r.Bottom:=Image1.Picture.Height-1;
Rect.Left:=0;
Rect.Right:=Image1.Picture.Width-1;
m:=0;
if StringGrid1.TopRow > 1 then
begin
m:=(StringGrid1.TopRow-1)*81;
end;
Rect.Top:=32+(n-1)*81-m;
Rect.Bottom:=Rect.Top+Image1.Picture.Height-1;
if Rect.Top < StringGrid1.Height then
begin
if Rect.Bottom > StringGrid1.Height then Rect.Bottom:=StringGrid1.Height;
StringGrid1.Canvas.CopyRect(Rect, Image1.Canvas, r);
end;
end;
end;
end;
end;
end;
end;
end;

TurboMagic 4. Mai 2019 16:42

AW: Stringgrid mit Bildern scrollen
 
Tipp: im Nachrichten Editor hier gibt's so einen goldene Helm Button.
Diese das nächste mal benutzen wenn du Code einfügen willst.
Dann sieht dein Beitrag schon gleich lesbarer aus...

Grüße
TurboMagic


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf