Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

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 Property "Objects" im Stringgrid (https://www.delphipraxis.net/37738-property-objects-im-stringgrid.html)

Hansa 17. Feb 2005 16:51

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:

plautzer 18. Feb 2005 21:43

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

Khabarakh 18. Feb 2005 22:12

Re: Property "Objects" im Stringgrid
 
str_grid und newtabsheet solltest du nur lokal in der ButtonClick-Prozedur deklarieren. Ändere dann TestForEdit in
Delphi-Quellcode:
function TForm1.TestForEdit(ACol, ARow : integer; grid: TStringgrid):integer;
um, da es ja in den vorigen Beispielen nur ein Grid gab. Um also das richtige Grid durch den Sender auszuwählen:
Delphi-Quellcode:
[...]
if TestForEdit(ACol, ARow, Sender as TStringgrid) then
[...]

plautzer 18. Feb 2005 22:33

Re: Property "Objects" im Stringgrid
 
FUNZT!!!


Dank dir.

Hansa 19. Feb 2005 00:07

Re: Property "Objects" im Stringgrid
 
Das ist gut, aber denke daran, daß das nicht alles ist. Die Objekte müssen wieder freigegeben werden.

plautzer 19. Feb 2005 11:42

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:
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;
wie kann ich nun aus lesen, welche zelle in welchen grid dieses object hat?
Nil ist mir schon bekannt, aber ganz bekommen ich das nicht hin.

Delphi-Quellcode:
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;
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?

Thx,

Plautzer

Hansa 19. Feb 2005 12:14

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:
  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;
Das steht bei mir im FormHide. FormClose ginge auch.

plautzer 19. Feb 2005 12:43

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

Hansa 19. Feb 2005 12:59

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:
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;
Will ich nun eine Zelle sperren, dann rufe ich das einfach so auf :

Delphi-Quellcode:
ChangeEditObjectMouseSelect (2,2,false);
In diesem Fall käme ich an Zelle 2,2 nicht mehr dran.

plautzer 19. Feb 2005 16:31

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 09:31 Uhr.
Seite 4 von 6   « Erste     234 56      

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