| Autor |
Beitrag |
bh_brain
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: Sa 22.03.03 17:25
Hier mein Ereignis:
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 UGrohne: Code-Tags eingefügt
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Sa 22.03.03 19:15
Du hast da mehrere Denkfehler drin
das Ereignis heißt ondrawCell nicht ondrawCell s
ondrawcell zeichnet eine Zelle[acol,arow], die übergeben werden.
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
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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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:
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 UGrohne: Code-Tags eingefügt
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
bh_brain 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mo 24.03.03 08:48
Danke, jetzt klappt alles 
|
|
|