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 Frage zu TStringGrid (https://www.delphipraxis.net/147992-frage-zu-tstringgrid.html)

DelTurbo 20. Feb 2010 10:38


Frage zu TStringGrid
 
Hi,

ich habe eine frage zum TStringGrid. Ich habe z.b. 20 zeilen die jeweils einem "abgetrennten" thread gehören. Damit ich die zeile aus dem grid zuordnen kann, bin ich hingegangen und habe das grid um eine celle erweitert. Dort schreibe ich dann die nummer rein.

Nun ist das natürlich nicht schön, weil der grid nicht änderbar sein darf. Sonst würde man ja die info ins fenster ziehen. Gibt es eine andere möglichkeit so einem grid pro row einen wert mitzugeben? Ein tag habe ich leider nicht gefunden.

Danke im voraus

Klaus01 20. Feb 2010 10:45

Re: Frage zu TStringGrid
 
Mahlzeit,

vielleicht verstehe ich Dich nicht richtig, aber
die Zeile eines StringGirds läßt sich doch einwandfrei
durch die Zeilennummer/Index identifizieren.

Grüße
Klaus

DelTurbo 20. Feb 2010 10:49

Re: Frage zu TStringGrid
 
Die laufenden threads sind nach einer zeit nicht mehr in der reihenfolge. Die haben dann z.b. die nummern 5,10,49,50. Deswegen kann ich das nicht, so wie du meinst, zuweisen. Ich muss jeder row diese nummer mitgeben. Damit ich bei einem doppelklick auf die row weis zu wem sie gehört.

DonManfred 20. Feb 2010 12:18

Re: Frage zu TStringGrid
 
du erstellst beim erstellen der Liste eine weitere COLUMN je ROW in der du die threadid speicherst. Beim doppelklick auf eine zeile liest du die dann die id aus der richtigen column.

DelTurbo 20. Feb 2010 12:28

Re: Frage zu TStringGrid
 
Genau so mache ich es ja im moment. Aber dann muss das grid ja "fest" sein. Sonst würde man die daten ja sehen können.

Deswegen suche ich einen anderen weg. Ich dachte das man mit irgendeinem trick der row was "mitgeben" kann.

DeddyH 20. Feb 2010 12:56

Re: Frage zu TStringGrid
 
Du könntest Dir eine Klasse deklarieren und diese mit AddObject einfügen. Beispiel (nur heruntergetippt und nicht groß getestet):
Delphi-Quellcode:
{$R *.dfm}

type
  TTestclass = class
  private
    FNumber: integer;
    FText: string;
  public
    property Number: integer read FNumber write FNumber;
    property Text: string read FText write FText;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var Testclass: TTestclass;
    i: integer;
begin
  StringGrid1.Rows[1].Clear;
  StringGrid1.Rows[1].Add('');
  for i := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do
    begin
      Testclass := TTestclass.Create;
      Testclass.Number := i;
      Testclass.Text := 'Test';
      StringGrid1.Rows[1].AddObject(Testclass.Text,Testclass);
    end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i,j: integer;
begin
  for i := 0 to StringGrid1.RowCount - 1 do
    for j := 0 to StringGrid1.ColCount - 1 do
      StringGrid1.Rows[i].Objects[j].Free;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
var Testclass: TTestclass;
begin
  Testclass := TTestclass(StringGrid1.Rows[StringGrid1.Row].Objects[StringGrid1.Col]);
  if Assigned(Testclass) then
    ShowMessage(IntToStr(Testclass.Number));
end;

DelTurbo 20. Feb 2010 13:11

Re: Frage zu TStringGrid
 
Muss ich mir mal ansehen UND begreifen :P . Weil mein grid ja keine feste grösse hat.

Vielen dank erstmal

Hawkeye219 20. Feb 2010 13:30

Re: Frage zu TStringGrid
 
Hallo,

es gibt einige Möglichkeiten. Die sauberste besteht wohl darin, neben dem Grid eine Zuordnungstabelle zu pflegen, in der für jeden Thread die zugehörige Zeile des Gitters abgelegt wird. Aber auch im Grid kann man weitere (unsichtbare) Informationen unterbringen. Der bereits erwähnten Zusatzspalte könntest du die Breite 0 oder -1 geben, um sie vor dem Anwender zu verbergen. Eine Alternative wäre das Objects-Array von TStringGrid, in dem für jede Zelle ein TObject-Element abgelegt werden kann. Falls du es noch nicht verwendest, kannst du dort beispielsweise für die Zellen der ersten Spalte über einen Typecast auch die Thread-ID einer Zeile hinterlegen:

Delphi-Quellcode:
Grid.Objects[0, Row] := TObject(ThreadID);
  :
ThreadID := Integer(Grid.Objects[0, Row]);
Gruß Hawkeye

DelTurbo 20. Feb 2010 13:39

Re: Frage zu TStringGrid
 
BOING... breite 0 wär im grunde am einfachsten. Dann brauch ich garnix ändern. Also manchmal steht man wie ochs vorm berg.

Ich werde mir trotzdem heute abend mal alle 3 optionen ansehen. Was ich nicht möchte, ist das mit der extra tabelle handlen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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