![]() |
Re: Property "Objects" im Stringgrid
Wenn das alles ist was du wissen willst, dann bist du nicht auf dem Holzweg. Aber leider "no time". Prüfe einfach auf NIL. :mrgreen:
|
Re: Property "Objects" im Stringgrid
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:
Mein problem:
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; 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 |
Re: Property "Objects" im Stringgrid
str_grid und newtabsheet solltest du nur lokal in der ButtonClick-Prozedur deklarieren. Ändere dann TestForEdit in
Delphi-Quellcode:
um, da es ja in den vorigen Beispielen nur ein Grid gab. Um also das richtige Grid durch den Sender auszuwählen:
function TForm1.TestForEdit(ACol, ARow : integer; grid: TStringgrid):integer;
Delphi-Quellcode:
[...]
if TestForEdit(ACol, ARow, Sender as TStringgrid) then [...] |
Re: Property "Objects" im Stringgrid
FUNZT!!!
Dank dir. |
Re: Property "Objects" im Stringgrid
Das ist gut, aber denke daran, daß das nicht alles ist. Die Objekte müssen wieder freigegeben werden.
|
Re: Property "Objects" im Stringgrid
mahlzeit,
freigeben: aber erst beim schließen der Programms, oder? Was passiert wenns man's nicht macht?` Wenn einen Zelle bearbeitet wird, bekommt sie eine Object 'editiert'.
Delphi-Quellcode:
wie kann ich nun aus lesen, welche zelle in welchen grid dieses object hat?
procedure TForm1.AddeditObjectToGrid(ACol, ARow : integer);
var st_grid:tgrid; begin reihe := Treihe.Create; reihe.editiert := editiert; Form1.st_grid.Objects[ACol, ARow] := reihe; end; Nil ist mir schon bekannt, aber ganz bekommen ich das nicht hin.
Delphi-Quellcode:
Per buttonclick soll mit allen editierten zellen irgentwas passieren, z.b. das objekt nr an eine listbox abgeben werden. Könnt ihr mir da nochmal aushelfen?
function TForm1.TestForEditiert(ACol, ARow : integer; grid: TStringgrid):boolean;
var st_grid:tgrid; begin if grid.Objects[ACol, ARow] <> nil then begin reihe := Treihe(grid.Objects[ACol, ARow]); result := reihe.editiert; end else result := false; end; Thx, Plautzer |
Re: Property "Objects" im Stringgrid
Deine Nomenklatur ist etwas verwirrend. 8) Ist Reihe eine Zelle des Grids oder was ? :gruebel: Dann nenne sie doch Zelle. Was das freigeben betrifft :
Delphi-Quellcode:
Das steht bei mir im FormHide. FormClose ginge auch.
for i := sgNr.FixedCols to sgNr.ColCount - 1 do
for j := sgNr.FixedRows to sgNr.RowCount - 1 do if sgNr.Objects [i,j] <> nil then begin sgNr.Objects [i,j].Free; sgNr.Objects [i,j] := nil; end; |
Re: Property "Objects" im Stringgrid
Hmm, stimmt das mit der reihe ist ein bizzl verwirren, ich habs auch nur so genannt, weil für mich die reihe interessant ist, welche zelle davon ist egal. Aber stimmt schon, das werde ich mal ändern.
Lassen sich nun alle vorhanden Grids auf das onject editiert untersuchen? Plautzer |
Re: Property "Objects" im Stringgrid
Das hängt von Deiner Programm-Architektur ab. Bei mir gibts ein Grid, in dem alles definiert ist. Und dieses vererbe ich weiter. In den Stringgrid-Objekten habe ich alles für die Zellen nötige hinterlegt : Color, MouseSelect (ähnlich wie dein editable) und einiges mehr. In dem Ursprungsgrid sind die Events auch hinterlegt und die Prozeduren, Werte zu ändern. z.B. so :
Delphi-Quellcode:
Will ich nun eine Zelle sperren, dann rufe ich das einfach so auf :
procedure Tfrm.ChangeEditObjectMouseSelect (ACol, ARow : integer; // zum Ändern von
MouseSelect : boolean); // Eigenschaften pro Zelle begin if sgNr.Objects[ACol, ARow] <> nil then (sgNr.Objects[ACol, ARow] as TEditObject).MouseSelect := MouseSelect; end;
Delphi-Quellcode:
In diesem Fall käme ich an Zelle 2,2 nicht mehr dran.
ChangeEditObjectMouseSelect (2,2,false);
|
Re: Property "Objects" im Stringgrid
soviel habe ich ja verstanden. Wenn ich die geänderten Zellen speichern will, muss ich erst einaml herauskriegen welche das sind.
Am besten wäre es, wenn man alle Zeilen im grid durchgehen könnten und prüft ob, diese editiert wurde, wenn ja, dann folgt gleich die speicherung, der ganzen ZEILE etc. Mein problem ist, das ich nicht weiss wieviel einträge jedes Grid hat und wie viele grids überhaupt vorhanden sind. Also macht sich da ne schleife nicht gut. Plautzer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 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