AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Property "Objects" im Stringgrid

Ein Thema von Hansa · begonnen am 9. Jan 2005 · letzter Beitrag vom 24. Feb 2005
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#31

Re: Property "Objects" im Stringgrid

  Alt 17. Feb 2005, 17:51
Wenn das alles ist was du wissen willst, dann bist du nicht auf dem Holzweg. Aber leider "no time". Prüfe einfach auf NIL.
Gruß
Hansa
  Mit Zitat antworten Zitat
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
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#33

Re: Property "Objects" im Stringgrid

  Alt 18. Feb 2005, 23:12
str_grid und newtabsheet solltest du nur lokal in der ButtonClick-Prozedur deklarieren. Ändere dann TestForEdit in
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
[...]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
plautzer

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

Re: Property "Objects" im Stringgrid

  Alt 18. Feb 2005, 23:33
FUNZT!!!


Dank dir.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#35

Re: Property "Objects" im Stringgrid

  Alt 19. Feb 2005, 01:07
Das ist gut, aber denke daran, daß das nicht alles ist. Die Objekte müssen wieder freigegeben werden.
Gruß
Hansa
  Mit Zitat antworten Zitat
plautzer

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

Re: Property "Objects" im Stringgrid

  Alt 19. Feb 2005, 12:42
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#37

Re: Property "Objects" im Stringgrid

  Alt 19. Feb 2005, 13:14
Deine Nomenklatur ist etwas verwirrend. 8) Ist Reihe eine Zelle des Grids oder was ? 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
plautzer

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

Re: Property "Objects" im Stringgrid

  Alt 19. Feb 2005, 13:43
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#39

Re: Property "Objects" im Stringgrid

  Alt 19. Feb 2005, 13:59
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 :

ChangeEditObjectMouseSelect (2,2,false); In diesem Fall käme ich an Zelle 2,2 nicht mehr dran.
Gruß
Hansa
  Mit Zitat antworten Zitat
plautzer

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

Re: Property "Objects" im Stringgrid

  Alt 19. Feb 2005, 17:31
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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