Autor Beitrag
bh_brain
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 22.03.03 15:37 
Hi,

ich hab nen DrawGRid welches ich mit Bildern aus einer ImageList füllen möchte. Das Reinschreiben klappt ja, aber wenn ich dann die Bilder mit OnDrawCell zeichnen lasse, komme ich in eine Endlosschleife. Der Zeichnet die Bilder ohne Unterbrechnung immer wieder ins Grid und ich kann nichts mehr machen. Hab schon alles mögliche probiert, aber mir fehlt irgendwie der entscheidende Tipp. Hoffentlich kann mir einer helfen.

Danke
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Sa 22.03.03 16:47 
Hallo,

poste doch mal bitte dein ondrawcell-ereignis

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 22.03.03 17:25 
Hier mein Ereignis:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TfrmEditor.drwGdFeldBilderDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

var
  i, Anzahl : byte;
  bild : TBitmap;

begin
  bild := TBitmap.Create;
  Anzahl := imgLstFeldBilder.Count;
  drwGdFeldBilder.RowCount := Anzahl;
  for i := 0 to Anzahl-1 do
  begin
    drwGdFeldBilder.Col := 0;
    drwGdFeldBilder.Row := i;
    imgLstFeldBilder.GetBitmap(i, bild);
    drwGdFeldBilder.Canvas.StretchDraw(rect, bild);
  end;
  bild.Free;
end;

Also mein Drawgrid hat nur eine Spalte mit beliebig vielen Zeilen, genauso viele wie Bilder in der ImageList.

Moderiert von user profile iconUGrohne: Code-Tags eingefügt
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Sa 22.03.03 19:15 
Du hast da mehrere Denkfehler drin
das Ereignis heißt ondrawCell nicht ondrawCells
ondrawcell zeichnet eine Zelle[acol,arow], die übergeben werden.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TfrmEditor.drwGdFeldBilderDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

var
  i, Anzahl : byte;
  bild : TBitmap;

begin
  bild := TBitmap.Create;     //Bitmap erstellen
  Anzahl := imgLstFeldBilder.Count;  //die Anzahl-Varibale brauchst du nicht
  drwGdFeldBilder.RowCount := Anzahl;  //das setzen von rowcount auf die anzahl der Bilder hat hier im OndrawCellereignis nix zu suchen, keine Ahnung wie dein Prog aufgebaut ist, aber im Oncreate der Form/beim Ändern der Imagelist ist ein bessere Platz für das setzen des rowcounts

  //jetzt durchläufst du alle bilder deiner Liste
  // da du aber innerhalb dieses Ereignisses col und Row setzt, verliert die Zelle den Fokus und eine andere erhält den Fokus und diese Zellen müssen neu gezeichnet werden (ondrawcell wird aufgerufen, dort wird wieder der Fokus geändert undwieder gehts von vorne los ....). das ist die Endlosschleife
  
  for i := 0 to Anzahl-1 do
  begin
    drwGdFeldBilder.Col := 0;
    drwGdFeldBilder.Row := i;
    imgLstFeldBilder.GetBitmap(i, bild);
    //hier ist der zweite Fehler, rect ist immer die zuzeichnende Zelle, 
    //durch deine Schleife zeichnest du alle Bilder in diese Zelle
    drwGdFeldBilder.Canvas.StretchDraw(rect, bild);
  end;
  bild.Free;
end;

richtiger müßte es so aussehen
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
bild:=TBitmap.create;
try
  imglistfeldBilder.getbitmap(arow,bild)
  drwgdfeldBilder.canvas.stretchdraw(rect,bild);
finally
  bild.free;
end;

ohne Delphi (grad keins zur Hand) hier reingeklimpert, kann noch ein Fehler drin sein.
Wobei ich mich grad auch frage, ob du überhaupt den Umweg über Bild gehen mußt

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 23.03.03 15:19 
Hi,

danke, wenn ich das jetzt richtig verstanden hab, kann ich das auch so machen, das ich die OnDrawCell von einer anderen Prozedur aufrufe, in der ich dann meine Schleife mache?
Weil ich versteh nicht wie bei deinem Code die ganze ImageList durchgelaufen wird.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 23.03.03 15:47 
du brauchst ondrawcell nicht direkt aufzurufen, das wird eh automatisch gemacht, wenn die Zelle neu gezeichnet werden muß.

Du hast das noch nicht richtig verstanden. mit Ondrawcell zeichnet man eine Zelle des Grids, nicht das ganze Grid.

in deinem Fall, wenn du z.B. drwgrid.repaint oder das Grid/Zellbereich aus irgendwelchen anderen Gründen neu gezeichnet werden muß, wird für jede Zelle das Ondrawcell ereignis ausgelöst.

also sinnbildlich in etwa so:
ausblenden Quelltext
1:
2:
3:
4:
drawcell(Sender, Col:0,Row:0, rect(0,0,100,10),  State);
drawcell(Sender, Col:0,Row:1, rect(0,10,100,20),  State);
drawcell(Sender, Col:0,Row:2, rect(0,20,100,30),  State);
usw.


im Ondrawcell ereignis wertest du dann die übergebenen Parameter einfach aus.
Row gibt dir die Zeile an und das ist dann bei dir dann gleichzeitig der Index in der Imagelist.
und Rect ist der "Zellbereich"

Mfg Frank

Moderiert von user profile iconUGrohne: Code-Tags eingefügt

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: So 23.03.03 19:40 
Oh, okay. Jetzt hab ich es. Also kann ich dann über die Parameter die übergeben werden (die Zeile) auch das richtige Bild aus der Imagelist herausholen, stimmt doch jetzt so, oder?

Danke für die nette Hilfe ;)
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 24.03.03 08:07 
bh_brain hat folgendes geschrieben:
Also kann ich dann über die Parameter die übergeben werden (die Zeile) auch das richtige Bild aus der Imagelist herausholen, stimmt doch jetzt so, oder?

ja

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 24.03.03 08:48 
Danke, jetzt klappt alles :D