Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bild in draw- oder stringgrid laden (https://www.delphipraxis.net/111299-bild-draw-oder-stringgrid-laden.html)

Dragonhunter1720 1. Apr 2008 20:48


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:

taaktaak 1. Apr 2008 20:59

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?

Dragonhunter1720 1. Apr 2008 21:11

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.

taaktaak 1. Apr 2008 21:25

Re: bild in draw- oder stringgrid laden
 
na, auf die Schnelle mal was zum StringGrid:
Delphi-Quellcode:
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;
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

Dragonhunter1720 1. Apr 2008 21:28

Re: bild in draw- oder stringgrid laden
 
Thanks erstmal
geht trotzdem nicht :wall:

taaktaak 1. Apr 2008 21:51

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!

Dragonhunter1720 1. Apr 2008 21:56

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?? :?:

taaktaak 1. Apr 2008 22:00

Re: bild in draw- oder stringgrid laden
 
Du musst das Rect aus den MethodenParametern verwenden!

Dragonhunter1720 1. Apr 2008 22:04

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

taaktaak 1. Apr 2008 22:11

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:
ImageList.Draw(StringGrid.Canvas,Rect.Left,Rect.Top,0);
Schau dir mal in Ruhe die DelphiHilfe zu diesem Befehl an, dann wird es auch funktionieren!

PS: Formatiere deinen Code bitte!

Dragonhunter1720 1. Apr 2008 22:16

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:

taaktaak 1. Apr 2008 22:21

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!

Dragonhunter1720 1. Apr 2008 22:34

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 ;)

Dragonhunter1720 1. Apr 2008 22:35

Re: bild in draw- oder stringgrid laden
 
gut nacht
bis morgen :hi: und THX schon mal

taaktaak 2. Apr 2008 07:35

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:

Die Methode "DrawGriddhDrawCell" wird für jede Zelle einzeln aufgerufen. Die Parameter ARow,ACol zeigen dir bei jedem Aufruf, welche Zelle gezeichnet werden soll.
Du darfst also in der Methode nur EIN Icon zeichnen! Aus den Werten von ARow und ACol musst du dir den IconIndex der jeweiligen Zelle ermitteln und an die Zeichenfunktion übergeben. Die Ermittlung des Indexwertes ist abhängig von der Sortierung der Icons in der Liste, da kann ich nur ein Beispiel geben:

Ansatz könnte sein:

Delphi-Quellcode:
var Idx : Integer;
//..
Idx:=ARow*DrawGrid1.ColCount+ACol;
ImageList1.Draw(DrawGrid1.Canvas,Rect.Left,Rect.Top,Idx);
//..
Im obigen Beispiel würde der Index zeilenweise über alle Spalten "laufen", also z.B. so
0..3
4..7
8..11

Dragonhunter1720 2. Apr 2008 18:59

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:
//------------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;
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)

Delphi-Quellcode:
//--------------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;
THX für deine hilfe, sonst wär ich noch nicht so weit :cheers:

michback 23. Jul 2008 09:32

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 ?

Erlkönig 17. Sep 2008 15:05

Re: bild in draw- oder stringgrid laden
 
genau das problem hab ich auch... wenn jdm ne hilfe weiß...

Blup 18. Sep 2008 16:22

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:
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;

Erlkönig 18. Sep 2008 22:19

Re: bild in draw- oder stringgrid laden
 
danke für die antwort. Ich habs auf nen andern weg gelöst bekommen

alzaimar 19. Sep 2008 06:37

Re: bild in draw- oder stringgrid laden
 
Zitat:

Zitat von Erlkönig
danke für die antwort. Ich habs auf nen andern weg gelöst bekommen

Und wie?

Erlkönig 20. Sep 2008 12:06

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:
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;
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.


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