Einzelnen Beitrag anzeigen

plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#32

Re: Property "Objects" im Stringgrid

  Alt 18. Feb 2005, 22:43
HI,

ich bin mal euer beispiel nachgegangen und es hat bei mir auch einwandfrei funktionieren, doch in diesem spezielleren fall wiederrum nicht:

Und zwar werden per buttonklick, die daten aus der tabelle nach ihre Ablesejahr auf x Stinggrids verteilt. Es werden die Stringgrids erstellt und anschließend gefüllt.

Delphi-Quellcode:
Tgrid = class(Tstringgrid)
    public
    name:tgrid;
    editiert : boolean;
    ID : integer;
    TableName : string;
  end;
Treihe = class(tobject)
   private
   nr: integer;
   end;

procedure TForm1.AddObjectToGrid(ACol, ARow : integer; nr : integer);
begin
  reihe := Treihe.Create;
  reihe.nr := nr;
  Form1.st_grid.Objects[ACol, ARow] := reihe;
end;

function TForm1.TestForEdit(ACol, ARow : integer):integer;
begin
  reihe := Treihe(sT_grid.Objects[ACol, ARow]);
  result := reihe.nr;
end;

procedure TForm1.Button10Click(Sender: TObject);
var datum:tdatetime;
    i,s,k,x,y, datum1:integer;
    a:string;
begin
ibdataset1.Close;
ibdataset1.SelectSQL.Clear;
ibdataset1.SelectSQL.Text := 'select distinct EXTRACT(YEAR FROM ABLESEDATUM) as ablesejahr from ABRECHNUNG';
ibdataset1.Open;
i:=0;
while i < ibdataset1.RecordCount do
begin
datum1:=ibdataset1.fieldbyname('ablesejahr').AsInteger;
NewTabSheet := TTabSheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;
newtabsheet.Caption:= inttostr(datum1);

st_grid:=tgrid.Create(newtabsheet);
st_grid.Parent := newtabsheet;
st_grid.TableName:='grid' + inttostr(datum1);

with st_grid do
begin
Left := 0;
Top := 0;
Width := newtabsheet.Height-5;
Height := newtabsheet.Width-5;
SetBounds(4,4,newtabsheet.Width-5,newtabsheet.Height-5);
ColCount := 12;
DefaultColWidth := 17;
DefaultRowHeight := 17;
RowCount := 2;
Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing];
TabOrder := 0;

ColWidths[1]:=17;
ColWidths[2]:=53;
ColWidths[3]:=50;
{ColWidths[4]:=54;
ColWidths[5]:=55;
ColWidths[6]:=54;
ColWidths[7]:=71;
ColWidths[8]:=71;
ColWidths[9]:=67;
ColWidths[10]:=45;
ColWidths[11]:=57;
ColWidths[12]:=23;}

RowHeights[1] := 17;
OnSelectCell := stringgrid1SelectCell; //Objekt nr der Zelle wd
end;
ibdataset2.Close;
ibdataset2.SelectSQL.Clear;
ibdataset2.SelectSQL.Text := 'select ABLESEDATUM, ablese_nr from ABRECHNUNG where EXTRACT(YEAR FROM ABLESEDATUM) = :a';
ibdataset2.ParamByName('a').AsInteger:=datum1;
ibdataset2.Open;

  k:=0;
  While K < ibDataset2.RecordCount do
  Begin
   st_grid.RowCount := st_grid.RowCount +1;
   st_grid.Cells[1,k+1]:=ibdataset2.fieldbyname('ablese_nr').AsString;
   st_grid.Cells[2,k+1]:=ibdataset2.fieldbyname('ablesedatum').AsString;
   AddObjectToGrid(1, k+1, ibdataset2.fieldbyname('ablese_nr').AsInteger);
   AddObjectToGrid(2, k+1, ibdataset2.fieldbyname('ablese_nr').AsInteger);
   ibdataset2.Next;
   k:=k+1
  end;
  st_grid.RowCount := st_grid.RowCount -1;

ibdataset1.Next;
i:=i+1;
end;
Mein problem:

Es wird zwar jeder Zelle ein Objekt(Nr) zugeordnet, jedoch erscheint beim Zellenklick immer die letzte NR aus der letzten Tabelle!!!

Ich denke, das problem liegt daran dass alle stringgrid gleich heißen, nämlich "st_grid" und dann immer der Wert aus dem letzten Grid genommen.

Wie kann ich jedem grid einen eigenen Namen geben, den ich dann bei späteren Prozeduren leicht auslesen kann?

Ich glaube mit arrays brauche ich nicht mehr ankommen, oder?

Thx,

Plautzer
  Mit Zitat antworten Zitat