![]() |
bild in draw- oder stringgrid laden
Hallo
mein problem: ich habe ein stringgrid (oder drawgrid) mit 1 zeile und 36 spalten darin wollte ich nun 36 verschiedene bilder laden, also pro zelle ein anderes bild ich habe es mit dem drawcell probiert, musste aber feststellen das das nicht geht, weil er immer das erste bild in alle 36 zellen lädt procedure TForm1.DrawGriddhDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var Bild: Timage; begin Bild := Timage.Create(self); Bild.Picture.LoadFromFile('N:\Dokumente\info\deskt op.ini projekt\bilder\hintergrundbilder\hintergrund.jpg') ; DrawGriddh.Canvas.StretchDraw(rect, bild.Picture.Graphic); end; //-------------------- procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var Bild: Timage; begin Bild:=Timage.Create(self); Bild.Picture.LoadFromFile('N:\Dokumente\info\deskt op.ini projekt\bilder\icons\icon6.ico'); StringGrid1.Canvas.StretchDraw(rect,Bild.Picture.G raphic); nun habe ich versucht die einzelnen zellen mit Row und Cow anzusprechen, um so meine ziel ver verwirklichen leider geht das auch nicht auch im formcreate habe ich das nicht hinbekommen :?: :?: :wall: meine frage: kann man im drawcell einzelne zellen ansprechen oder kann ich das irgendwie anders (z.B. im FormCreate) realisieren ??? THANKS für jede idee :spin2: |
Re: bild in draw- oder stringgrid laden
Moin, Moin,
kenne zwar DrawGrid nicht, wird aber wohl nicht grundlegend anders sein als StringGrid. Schau dir die Parameter der Methode mal an: ACol, ARow >> da hast du deine Zellansprache PS : Jedes mal das Bild aus der Datei laden? Ist da nicht eine ImageList praktischer und schneller? |
Re: bild in draw- oder stringgrid laden
ja das habe ich schon getan
aber leider finde ich nichts, wie ich das verwenden soll ARow:=0; ACol:=0; trozdem spricht er alle zellen an DrawGriddh.Canvas.FillRect(CellRect(0, 0),bild.Picture.Graphic); geht auch nicht!! zudem bin ich noch nicht so der spezialist (nur schüler 8) ) hast du noch eine andere idee oder am besten gleich ein Bsp. |
Re: bild in draw- oder stringgrid laden
na, auf die Schnelle mal was zum StringGrid:
Delphi-Quellcode:
Hat mit deiner konkreten Anforderung leider nix zu tun. Hier wird nur Text mit besonderer Formatierung ausgegeben, wenn die Zeile 3 und die Spalten >2 gezeichnet werden. Statt der Textausgabe musst du dann dein Icon zeichnen. - Hab' jetzt leider keine Zeit mehr: Muss für Töchterlein noch ein Referat fertig machen
procedure u_sgTopicsDrawCell(Sender:TObject;ACol,ARow:Integer;Rect:TRect;State:TGridDrawState);
begin if ARow=3 then if ACol> 2 then with Sender as TStringGrid do with (Sender as TStringGrid).Canvas do begin Font.Color:=clBlack; if EditMode then if gdSelected in State then Brush.Color:=clBtnFace else Brush.Color:=Color else if gdSelected in State then begin Brush.Color:=clHighLight; Font. Color:=clWhite; end else Brush.Color:=Color; FillRect(Rect); Rect.Right:=Rect.Right-lbLeftBorder; TextRect(Rect,Rect.Left+lbLeftBorder,Rect.Top+2,Cells[ACol,ARow]); end; end; |
Re: bild in draw- oder stringgrid laden
Thanks erstmal
geht trotzdem nicht :wall: |
Re: bild in draw- oder stringgrid laden
So, Referat ist fertig!
Funktioniert trotzdem nicht? Hm, ist OwnerDraw des Grids aktiviert? DrawGriddh.Canvas.FillRect(CellRect(0, 0),bild.Picture.Graphic); << CellRect(0,0) spricht natürlich immer die erste Zelle an! |
Re: bild in draw- oder stringgrid laden
procedure TForm1.DrawGriddhDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var Bild: Timage; begin Bild := Timage.Create(self); Bild.Picture.LoadFromFile('N:\Dokumente\info\deskt op.ini projekt\bilder\hintergrundbilder\hintergrund.jpg') ; DrawGriddh.Canvas.FillRect(CellRect(0, 0),bild.Picture.Graphic); end; Fehler: Undefinierter Bezeichner: CellRect wie muss ich ihn denn definieren?? :?: |
Re: bild in draw- oder stringgrid laden
Du musst das Rect aus den MethodenParametern verwenden!
|
Re: bild in draw- oder stringgrid laden
procedure TForm1.DrawGriddhDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); alt: DrawGriddh.Canvas.FillRect(CellRect(0, 0),bild.Picture.Graphic); neu: DrawGriddh.Canvas.Rect(CellRect(0, 0),bild.Picture.Graphic); -->undefinierter bezeichner: rect DrawGriddh.Canvas.FillRect(Rect(0, 0),bild.Picture.Graphic); -->operator oder semikolan fehlt ***bin noch anfänger :-D |
Re: bild in draw- oder stringgrid laden
So:
Alles Quatsch, was wir bisher gemacht haben! Mit FillRect werden keine Bilder gezeichnet! Wenn die Icons in einer ImageList sind (was sehr zu empfehlen ist), dann würden wir z.B. wie folgt ausgeben:
Delphi-Quellcode:
Schau dir mal in Ruhe die DelphiHilfe zu diesem Befehl an, dann wird es auch funktionieren!
ImageList.Draw(StringGrid.Canvas,Rect.Left,Rect.Top,0);
PS: Formatiere deinen Code bitte! |
Re: bild in draw- oder stringgrid laden
OK
nur noch eins :oops: meine bilder bzw. icons sind alle in einem ordner wie bekomme ich sie jetzt in einer ImageList und kann ich damit (ImageList.Draw(StringGrid.Canvas,Rect.Left,Rect.T op,0);) die einzelnen zellen des stringgrids ansteuern? weil ich seh da nur eine zahl (0) oder ist schon die für das col :gruebel: |
Re: bild in draw- oder stringgrid laden
Hm, hab jetzt Delphi nicht mehr laufen.
Die ImageList hat mit Sicherheit eine Methode "LoadFromFile" >> gehe mit dem Cursor auf das TImageList und drücke F1, dann weiter in der Hilfe nachschauen. Die Methode "DrawGriddhDrawCell" wird für jede Zelle einzeln aufgerufen. Die Parameter ARow,ACol zeigen dir bei jedem Aufruf, welche Zelle gezeichnet werden soll. In Rect wird das rechteck der aktuell zu zeichnenden Zelle übergeben. Du bekommst also alle Informationen bereitgestellt. edit: So, jetzt erst einmal Gute Nacht! |
Re: bild in draw- oder stringgrid laden
also
ImageList1.Draw(DrawGriddi.Canvas,Rect.Left,Rect.T op,20); damit bekomme ich hin dass alle 36 felder mit dem 20. icon aus der imagelist ausgestattet werden for index:=0 to 36 do ImageList1.Draw(DrawGriddi.Canvas,Rect.Left,Rect.T op,index); nun werden alle felder mit dem 36 icon aus der imagelist versehen --> aber wie bekomme ich hin, dass feld[0] := icon0 ....... feld[36]:= icon36 :?: :?: oder stell ich mich einfach mal wieder zu dumm an ;) |
Re: bild in draw- oder stringgrid laden
gut nacht
bis morgen :hi: und THX schon mal |
Re: bild in draw- oder stringgrid laden
Moin, Moin dragonhunter!
Sehr schön, dann bist du ja jetzt einen Schritt weiter. Ich möchte folgende Aussage noch einmal wiederholen: Zitat:
Ansatz könnte sein:
Delphi-Quellcode:
Im obigen Beispiel würde der Index zeilenweise über alle Spalten "laufen", also z.B. so
var Idx : Integer;
//.. Idx:=ARow*DrawGrid1.ColCount+ACol; ImageList1.Draw(DrawGrid1.Canvas,Rect.Left,Rect.Top,Idx); //.. 0..3 4..7 8..11 |
Re: bild in draw- oder stringgrid laden
so...
ich habe noch bis gestern abend / heute früh um 2 uhr probiert :coder: und nun geht es :bounce2: vielleicht nicht sauber programmiert, aber für meine zwecke reicht es
Delphi-Quellcode:
und nun kann ich während das programm läuft noch die felder ermitteln und dei bilder / icons in ein image laden vergrößerte ansicht)
//------------DrawGridDesktopIcon DrawCell--------------------------------------
procedure TForm1.DrawGridDIDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var i: integer; begin for i:=0 to 36 do if ACol=i then ImageList1.Draw(DrawGriddi.Canvas,Rect.Left,Rect.Top,i); end; //-------------StringGridDesktopHintergrund DrawCell---------------------------- procedure TForm1.StringGridDHDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var Bild: TImage; FileProject: string; begin FileProject:=ExtractFilePath(Application.ExeName); case ACol of 0: begin Bild := Timage.Create(self); Bild.Picture.LoadFromFile(FileProject+'bilder\hintergrundbilder\hintergrund1.jpg'); StringGridDH.Canvas.StretchDraw(rect, bild.Picture.Graphic); end; 1: begin Bild := Timage.Create(self); Bild.Picture.LoadFromFile(FileProject+'bilder\hintergrundbilder\hintergrund2.jpg'); StringGridDH.Canvas.StretchDraw(rect, bild.Picture.Graphic); end; 2: begin Bild := Timage.Create(self); Bild.Picture.LoadFromFile(FileProject+'bilder\hintergrundbilder\hintergrund3.bmp'); StringGridDH.Canvas.StretchDraw(rect, bild.Picture.Graphic); end; end; end;
Delphi-Quellcode:
THX für deine hilfe, sonst wär ich noch nicht so weit :cheers:
//--------------Desktopicon auswählen-------------------------------------------
procedure TForm1.DesktopiconauswaehlenClick(Sender: TObject); var i: integer; FileProject: string; begin FileProject:=ExtractFilePath(Application.ExeName); for i:=0 to 36 do begin if DrawGridDI.Col=i then pfaddesicons.text:=FileProject+'bilder\icons\Icon'+inttostr(i)+'.ico'; end; iconvorschau.Picture.loadfromfile(pfaddesicons.text) end; //--------------Desktopicon auswählen------------------------------------------- procedure TForm1.DesktophintergrundauswaehlenClick(Sender: TObject); var FileProject: string; begin FileProject:=ExtractFilePath(Application.ExeName); case StringGridDH.Col of 0: pfaddesbildes.Text:=FileProject+'bilder\hintergrundbilder\hintergrund1.jpg'; 1: pfaddesbildes.Text:=FileProject+'bilder\hintergrundbilder\hintergrund2.jpg'; 2: pfaddesbildes.Text:=FileProject+'bilder\hintergrundbilder\hintergrund3.bmp'; end; vorschau.Picture.LoadFromFile(pfaddesbildes.Text); vorschauSch.Stretch:=true; end; |
Re: bild in draw- oder stringgrid laden
Delphi-Quellcode:
Bild := Timage.Create(self);
Bild.Picture.LoadFromFile('papa.jpg'); StringGrid1.Canvas.StretchDraw(rec ,bild.Picture.Graphic); Und wie bekomme ich jetzt das bild in eine bestimmte zelle des grid ? |
Re: bild in draw- oder stringgrid laden
genau das problem hab ich auch... wenn jdm ne hilfe weiß...
|
Re: bild in draw- oder stringgrid laden
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:
Dann benötigt man die Information, welches Bild in welcher Zelle angezeigt werden soll.
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; In diesem Beispiel in einem zweidimensional dynamischen Array abgebildet:
Delphi-Quellcode:
Im eigentlichen DrawCell wird von uns nur verlangt eine einzelne Zelle zu zeichnen.
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; 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; |
Re: bild in draw- oder stringgrid laden
danke für die antwort. Ich habs auf nen andern weg gelöst bekommen
|
Re: bild in draw- oder stringgrid laden
Zitat:
|
Re: bild in draw- oder stringgrid laden
Also der Quelltext is zum großen Teil net slebt von mir sondern hab ich gegoogelt. deshalb kann ich auch leider net allzuviel dazu erläutern wenn fragen auftreten sollten. aber ich versuch mein bestes :wink:
Delphi-Quellcode:
Bei StringGrid1.SelectCell wird dann das bild angezeigt, wenn du auf einer der Zellen in der Stringgrid drückst. Dieser Teil ist auch selbst von mir.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var bmp : TBitmap; begin if FileExists(StringGrid1.Cells[ACol, ARow]) then begin bmp := TBitmap.Create; try bmp.LoadFromFile(StringGrid1.Cells[ACol, ARow]); StringGrid1.Canvas.CopyRect(Rect,bmp.Canvas,Classes.Rect(0,0,bmp.Width,bmp.Height)); finally bmp.Free; end; end; end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var i:integer; begin for I := 0 to StringGrid1.RowCount - 1 do StringGrid1.Rows[I].Clear(); openpicturedialog1.FileName:='{Dateipfad des Bildes}'; stringgrid1.Cells[ACol,ARow] := openpicturedialog1.FileName; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz