Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zur Laufzeit Bild in einem Stringgrid Ändern (https://www.delphipraxis.net/70464-zur-laufzeit-bild-einem-stringgrid-aendern.html)

Real_Thunder 30. Mai 2006 17:39


Zur Laufzeit Bild in einem Stringgrid Ändern
 
Hallo, ich habe volgenes Problem, ich möchte ein Bild zur Laufzeit Ändern Lassen...

Die Bilder werden Volgendermaßen im Stringgrid Gezeichnet

Delphi-Quellcode:
procedure Tstandart_frame_form.BuddyListDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Value_Split: TExplode_Array;

begin
// Bilder zeichnen

  setlength(Value_Split,length(Explode('<n|#|p>', my_buddies[ARow])));
  Value_Split:= Explode('<n|#|p>', my_buddies[ARow]);

  if Acol = 0 then begin
    if Value_Split[2] = 'OFFLINE' then BuddyList.Canvas.Draw(Rect.Left+4,Rect.Top+2,offline_pic.Picture.Bitmap)
    else if Value_Split[2] = 'Abwesend' then BuddyList.Canvas.Draw(Rect.Left+4,Rect.Top+2,abwesend_pic.Picture.Bitmap)
    else if Value_Split[2] = 'Versteckt' then BuddyList.Canvas.Draw(Rect.Left+4,Rect.Top+2,offline_pic.Picture.Bitmap)
    else BuddyList.Canvas.Draw(Rect.Left+4,Rect.Top+2,online_pic.Picture.Bitmap);
  end;

// Ende Bilder zeichnen


end;
Nun möchte ich bei einem Bestimmten Ereignis, das diese Procedure noch einmal durchläuft....
nur weiß ich nicht wie ich es Bewerkstelligen soll. da diese Procedure ja viele werte hat


oder kann mir jemand sagen, wie ich einfach nur ein bild in einer bestimmten Zelle zur laufzeit ändern kann, ohne das alles durchläuft.

MfG Real_Thunder

Hawkeye219 30. Mai 2006 18:39

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
Hallo Real_Thunder,

vielleicht hilft dir der folgende Code:

Delphi-Quellcode:
procedure InvalidateGridCell (aGrid: TDrawGrid; aCol, aRow: Integer);
  var lRect: TRect;
begin
  if Assigned(aGrid) then
  begin
    lRect := aGrid.CellRect(aCol, aRow);
    if not IsRectEmpty(lRect) then
      InvalidateRect(aGrid.Handle, @lRect, False);
  end;
end;
Mit der Prozedur kannst du eine beliebige Zelle eines Grids aktualisieren lassen.

Gruß Hawkeye

marabu 30. Mai 2006 18:50

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
Noch ein paar Anregungen:

Eventuell ist auch bei euch die Methode InvalidateCell() implementiert?

Die Images würde ich in einer ImageList vorhalten und die Buddies in einer TObjectList:

Delphi-Quellcode:
type
  TBuddyStatus = (bsUndefined, bsOffline, bsHidden, bsAbsent, bsOnline);

  TBuddy = class
    Nick: String;
    Status: TBuddyStatus;
  end;

procedure TDemoForm.StringGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Buddy: TBuddy;
  iLeft, iTop: Integer;
  bm: TBitmap;
begin
  with Sender as TStringGrid do
  begin
    Buddy := BuddyList[ARow] as TBuddy;

    if ACol = 0 then
    begin
      iLeft := Rect.Left + 4;
      iTop := Rect.Top + 2;
      ImageList.GetBitmap(Ord(Buddy.Status), bm);
      Canvas.Draw(iLeft, iTop, bm);
    end;
  end;
end;
Freundliche Grüße vom marabu

Hawkeye219 30. Mai 2006 19:20

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
Zitat:

Zitat von marabu
Eventuell ist auch bei euch die Methode InvalidateCell() implementiert?

Das war auch mein erster Gedanke. Leider steht die Methode im protected-Bereich, damit ist sie nur über einen "class hack" zu erreichen (überprüft bei D6 und D2006).

Gruß Hawkeye

Real_Thunder 30. Mai 2006 23:22

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
Könntest du mir die Procedur erklären ? was mit welchem befehl Gemeint ist ?

ich Steige da nicht richtig durch, und nur copy und paste, und ein wenig ändern, möchte ich nciht,
da dies den lerneffect behindert

Bin erst seit ca einem Monat mit Delphi am programmieren, und kenne bei weitem noch nicht alle Funktionen etc...

Real_Thunder 30. Mai 2006 23:37

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
Zitat:

Zitat von Hawkeye219
Delphi-Quellcode:
procedure InvalidateGridCell (aGrid: TDrawGrid; aCol, aRow: Integer);


Wie Spreche ich die Procedure an ? also TDraw Grid, was muß ich übergeben ?

also quasi
Delphi-Quellcode:
InvalidateGridCell ( ?????, 0, 0);

Real_Thunder 31. Mai 2006 00:02

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
So habe es nun soweit das er das Bild Ändert, nur sobald die procedure durch ist, geht das bild wieder in den Standart

habe es so gemacht:

Delphi-Quellcode:
procedure TStandart_frame_form.InvalidateGridCell (aGrid: TDrawGrid; aCol, aRow: Integer);
  var lRect: TRect;
  Value_Split: TExplode_Array;
  begin
  if Assigned(aGrid) then begin
    lRect := aGrid.CellRect(aCol, aRow);
    if not IsRectEmpty(lRect) then begin
      InvalidateRect(aGrid.Handle, @lRect, False);

      BuddyList.Canvas.Draw(lRect.Left+4,lRect.Top+2,abwesend_pic.Picture.Bitmap);

      sleep(1000); // Um zu Sehen, das sich überhaupt was tut.
    end;
  end;
end;


procedure Tstandart_frame_form.Button1Click(Sender: TObject);
  begin
    InvalidateGridCell (Buddylist, 0, 0);
  end;

Real_Thunder 31. Mai 2006 01:59

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
OK
danke für die Hilfe, hat geplappt, ich denke zwar das es nicht die sauberste lösung ist, was ich gemacht habe,
aber besser als nichts ;)

marabu 31. Mai 2006 06:01

Re: Zur Laufzeit Bild in einem Stringgrid Ändern
 
Du störst den Ablauf der Dinge. Die Informationen, welche festlegen, was in deinem Grid angezeigt werden soll, befinden sich doch in deiner Buddy-Liste (my_buddies). Die Ausgabe der korrekten Daten und Bilder erledigt OnDrawCell(). Beim Drücken von Button1 musst du also die Daten wie gewünscht abändern und dann die Routine von Hawkeye aufrufen. Der Aufruf der Methode Draw() in InvalidateGridCell() muss weg.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 Uhr.

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