Delphi-PRAXiS
Seite 2 von 2     12   

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 19. Feb 2005 16:39

Re: Property "Objects" im Stringgrid
 
Und eine Zeile bestht aus ColCount Zellen. Gehe die doch einfach durch mit Schleife. Ein StringGrid besteht eben aus Zellen und nicht aus Zeilen.

plautzer 20. Feb 2005 12:14

Re: Property "Objects" im Stringgrid
 
Hi,

ich habe nochmal ein paar um zu vergewissen das ich auf dem richtigen weg bin.

Meine erste Frage hierzu:

Delphi-Quellcode:
Tgrid = class(Tstringgrid)
    public

    TableName : string;
  end;
Tzelle = class(tobject)
   private
   nr: integer;
   reihe: integer;
   editiert: boolean;
   end;
Ist das sinnvoll zwei objekte für das stringgrid zu wählen? Denn ich merk gerade das ich probleme habe, das grids nach dem zellenobjekt zu druchforsten:

Delphi-Quellcode:
for i := st_grid.FixedCols to st_grid.ColCount do
    for j := st_grid.FixedRows to st_grid.RowCount do
   if zelle.editiert = true then begin  //prüfen ob die zelle editiert wurde
        showmessage(inttostr(zelle.reihe));
      end;
und so wird sie deklariert:

Delphi-Quellcode:
procedure TForm1.zellenchange(ACol, ARow : integer;sgNr:tgrid ;editiert:boolean);
begin
    if sgNr.Objects[ACol, ARow] <> nil then
    (sgNr.Objects[ACol, ARow] as Tzelle).editiert := editiert;
end;
...
x:=(Sender as Tstringgrid).Col;
y:=(Sender as Tstringgrid).row;
zellenchange(x,y,Sender as Tgrid,true);
Ich alles mit einem Objekt 'tgrid' machen?

Hansa 20. Feb 2005 12:34

Re: Property "Objects" im Stringgrid
 
Ich habe ca. 20-40 Grids und komme mit 2 Objects aus. Eines für Eingabe und das andere für Ausgabe-Operationen. Vielleicht täusche ich mich, aber irgendwie sehe ich da zu viele "AS". Vermutlich bist du mit Tablename noch nicht so ganz einig. Packe den Namen doch notfalls auch noch in die Objects direkt mit rein.

plautzer 23. Feb 2005 19:43

Re: Property "Objects" im Stringgrid
 
Hi,

ich habe meine liebe zum array wieder gefunden :mrgreen:

das ganze sieht nun so aus:

Delphi-Quellcode:
grid :array[1..20] of tstringgrid;
      grd:integer;

procedure TForm1.AddObjectToGrid(ACol, ARow : integer; nr : integer; st_grid:tstringgrid);
begin
  zelle := Tzelle.Create;
  zelle.nr := nr;
  zelle.reihe := arow;
  zelle.editiert:=false;
  st_grid.Objects[ACol, ARow] := zelle;
end;


grd:=1;
while grd < ibdataset1.RecordCount+1 do
begin
datum1:=ibdataset1.fieldbyname('ablesejahr').AsInteger;
NewTabSheet := TTabSheet.Create(PageControl1);
NewTabSheet.PageControl := PageControl1;
newtabsheet.Caption:= inttostr(grd);

grid[grd]:=tstringgrid.Create(newtabsheet);
grid[grd].Parent := newtabsheet;
//grid[grd].TableName:='grid' + inttostr(datum1);
grid[grd].name:='grid' + inttostr(datum1);
with grid[grd] do
....

  k:=0;
  While K < ibDataset2.RecordCount do
  Begin
   grid[grd].RowCount := grid[grd].RowCount +1;
   grid[grd].Cells[1,k+1]:=ibdataset2.fieldbyname('ablese_nr').AsString;
   grid[grd].Cells[2,k+1]:=ibdataset2.fieldbyname('ablesedatum').AsString;
   AddObjectToGrid(1, k+1, ibdataset2.fieldbyname('ablese_nr').AsInteger, grid[grd]);
   AddObjectToGrid(2, k+1, ibdataset2.fieldbyname('ablese_nr').AsInteger, grid[grd]);
   ibdataset2.Next;
   k:=k+1
  end;
...
Per keydown wird das objekt zellen.editiert auf true gesetzt und das will ich dann so auslesen:
Delphi-Quellcode:
 
for k:=1 to grd do
  for i :=grid[k].FixedCols to grid[k].ColCount do  <--- Hier bringt Delphi die Fehlermeldung
    for j := grid[k].FixedRows to grid[k].RowCount do
       if zelle.editiert = true then
          begin
          zelle.editiert:=false;
          showmessage(inttostr(zelle.reihe));
          end
Wenn ich das jetzt ausführe, und nichts wurde geändert, dann kommt ne Fehlermeldung "Zugriffsverletzung...". Die kommt auch, wenn die Schleife einmal durchlaufen wurde.
Sieht jemand den Grund dafür?

Thx,

Plautzer

Keldorn 23. Feb 2005 19:51

Re: Property "Objects" im Stringgrid
 
Hallo
Delphi-Quellcode:
  for i :=grid[k].FixedCols to grid[k].ColCount -1  do  
    for j := grid[k].FixedRows to grid[k].RowCount -1  do
die rows und cols fangen bei 0 an, die letze ist jeweils Anzahl-1

Mfg Frank

plautzer 23. Feb 2005 20:06

Re: Property "Objects" im Stringgrid
 
Der Fehler bleibt unverändert

Delphi-Quellcode:
k:=1;
while k < grd+1 do
  begin
  for i :=grid[k].FixedCols to grid[k].ColCount-1  do
    for j := grid[k].FixedRows to grid[k].RowCount-1  do
       if zelle.editiert = true then
          begin
          zelle.editiert:=false;
          showmessage(inttostr(zelle.reihe));
          end;
    k:=k+1;
    enD;
Plautzer

Keldorn 23. Feb 2005 20:16

Re: Property "Objects" im Stringgrid
 
Zitat:

while k < grd+1 do
warum jetzt hier +1?

dein grid-array ist statisch. Das fängt und endet dort, wie du es definierst [1 bis 20] oder auch [99 bis 101]. cols und rows sind dynamisch, die beginnen bei 0.

Mfg Frank

plautzer 23. Feb 2005 21:28

Re: Property "Objects" im Stringgrid
 
Zitat:

warum jetzt hier +1?
Angenommen es gibt 3 grids, k wurde anfangs auf 1 gesetzt, also muss die schleife 3mal durchlaufen werden. Wenn also k = 1 und grd = 3, dann wird die schleife nur zweimal durchlaufen, also ist k max 2.

Delphi-Quellcode:
Das fängt und endet dort, wie du es definierst [1 bis 20] oder auch [99 bis 101]. cols und rows sind dynamisch, die beginnen bei 0.
heißt das, dass grd immer bis 20 durchlaufen wird? Ich habe aber angenommen nur 1..3 von den 1..20 benutzt, kann man das irgentwie einschränken?

PLautzer

Hansa 23. Feb 2005 23:23

Re: Property "Objects" im Stringgrid
 
Plautzer, der Weg am Anfang war schon gut. Jetzt kommt ein 2-dimensionales Problem ins Spiel. Ist das wirklich nötig ? 8)

Robert_G 23. Feb 2005 23:48

Re: Property "Objects" im Stringgrid
 
Zitat:

Zitat von Hansa
Plautzer, der Weg am Anfang war schon gut. Jetzt kommt ein 2-dimensionales Problem ins Spiel. Ist das wirklich nötig ? 8)

Der Weg war weder am Anfang gut, noch wird er gut werden wenn ihr euch weiter auf diesem Holzweg aufhaltet.
Objects ist, genau wie Tag, nur eine Art Hilfe für Quick'nDirty-Lösungen. Wenn es mal husch-husch gehen muss.
Da ihr jetzt schon mehrere Tage damit verbringt kann man Quick rausstreichen. ;)
Ihr scheint nicht sehr vetraut mit OOP zu sein. (ist nicht böse gemeint ;) )
Doch selbst mit wenig Erfahrung in objektorientierter Programmierung solltet ihr in wenigen Stunden eine eigene Grid-Ableitung hinbekommen können.
Eine in der man sein Formular nicht mit unnötigen Code vollstopfen muss.
http://www.delphipraxis.net/internal...=301978#301978
Sowas hat einfach rein gar nichts in einem Formular zu suchen, das kann man doch sonst nie wiederverwenden, geschweige denn lesen.

Hansa 24. Feb 2005 00:03

Re: Property "Objects" im Stringgrid
 
Zitat:

Zitat von Robert_G
...Sowas hat einfach rein gar nichts in einem Formular zu suchen, das kann man doch sonst nie wiederverwenden, geschweige denn lesen.

Wieso kann man das nicht wieder verwenden ? :shock: Natürlich kann man das. OOP ist schwer, ich weiß. :mrgreen:

plautzer 24. Feb 2005 06:53

Re: Property "Objects" im Stringgrid
 
Morgen,

das alles ist nun leicht verwirrend :? für mich. Ich will das so einfach wie möglich lösen und wenns geht auf ne elegantere Art und Weise als wie ich das am Anfang hatte.

Ich finde das mit den Objects nicht schlecht, wenn die aber nicht das richtige sein sollten was dann?

Seitweit hat das doch alles funktioniert jetzt gehst halt nur noch ums auslesen, ob editiert oder nicht.

Plautzer

Hansa 24. Feb 2005 11:56

Re: Property "Objects" im Stringgrid
 
Dann lasse dich eben nicht verwirren. 8) Wieso soll man so was nicht weiterverwenden können ? Das einzige was verwirrend ist, das ist die Tatsache, daß du plötzlich für ein Grid (also ein Array) ein zweites Array brauchst. Ich brauche für solche Sachen nur noch 3 Prozeduren anzupassen. Das sind ca. 50 Zeilen Code. Die Stringgrid.Objects spielen eine wichtige Rolle. Damit erschlage ich jedes Grid. Trotz unterschiedlicher Spaltenanzahl, unterschiedlicher Datasets, unterschiedlicher Darstellung, unterschiedlicher Zahlenformate usw.

Stop, es sind sogar nur 2 Prozeduren : ErmittleDaten und ZeigeDetailPositionen. Die erste enthält ein teilweise komplexes Select-Statement, um die Daten anzufordern. Die zweite muß ich an das jeweilige Grid anpassen, also was genau in welcher Zelle steht. Und da kommen nun die Stringgrid.Objects ins Spiel. Z.B. halte ich damit fest, ob der Mindestbesatnad unterschritten ist. Ist das der Fall, so werte ich es im OnDrawCell aus und färbe die Zelle, so daß man es sofort sieht. Das betrifft jetzt mehr die Ausgabe.

Bei der Eingabe gibt es folgenden Fall : ich will die Zellen wissen, bei denen etwas gescannt wurde. Sie sollen sich von denen, die von Hand eingegeben wurden unterscheiden. Wurde gescannt, so setze ich das Objects-Feld SCAN auf true. Im OnDrawCell gucke ich dann da nach und schreibe noch klein "scan" in die entsprechende Zelle. Gleichzeitig wird editable (oder wie es bei mir heißt MouseSelect) auf false gesetzt. Im OnSelectCell wird das nun abgefragt. Bei Ergebnis = false, geht es eben nicht. Das dient um bereits eingegebene Werte nicht mehr ändern zu können.

Wer jetzt kommt und sagt, das würde so nicht gehen oder das wäre zu kompliziert, der muß eben noch lernen wie das geht. :mrgreen: Kiar und Sharky benutzen die Dinger übrigens auch. Zumindest wurde das gesagt. Sharky hält damit die IDs seiner Daten fest. Und Kiar muß irgendwelche Zellen "halbieren" und die Hälften auch färben. All das läßt sich genial einfach mit diesen Objects realisieren.

Wer sich das nicht mal angesehen hat, der sollte es sich dringend mal anschauen ! Nur über Delphi motzen zählt nicht. :lol:

plautzer 24. Feb 2005 12:43

Re: Property "Objects" im Stringgrid
 
HI,

das mit dem zweiten Array kapiere ich immernoch nicht ganz :?

Im Grunde genommen habe ich doch auch bloß zweite Methode um die Daten zu füllen und um sie auszulesen.
Jedoch ist ein für mich wichtig zu wissen wie viele Grids erstellt wurden um später beim speichern eine einwandfreie Schleife zu erstellen. Wie sollte ich das sonst machen?

Ich nehme an du hast in deinem Programm keine Methode um alle veränderten Zelle auszulesen, die machst sie bloß sichtbar. Ich brauche ihre Position um zuwissen was ich speichern muss.

Das wäre dann das:
Delphi-Quellcode:
k:=1;
while k < grd+1 do
  begin
  for i :=grid[k].FixedCols to grid[k].ColCount-1  do
    for j := grid[k].FixedRows to grid[k].RowCount-1  do
       if zelle.editiert = true then
          begin   // wenn die zelle editiert wurde, dann mache was z.b. speichere
          zelle.editiert:=false;
          showmessage(inttostr(zelle.reihe));
          end;
    k:=k+1;
    enD;
Für mich macht das ganze Sinn. Der ort der Zelle wird perfekt deklariert, und so kann es nicht zu Missverständnissen kommen und keine zelle wird ausgelassen.

Hier ist noch das ganze Problem, es kommt zu fehlermeldung wenn er die schleife das zweite Mal durchläuft.

Keldorn 24. Feb 2005 15:56

Re: Property "Objects" im Stringgrid
 
@plautzer

Warum Du jetzt eine while Schleife hast, weiß ich nicht. Es ist aber dasselbe wie
Delphi-Quellcode:
For i:=1 to grd do
Wenn du schreibst, das du eine Fehlermeldung beim 2. Durchlauf bekommst. Wo setzt du überhaupt Zelle? Und wo genau und welche Fehlermeldung erhälst du?

@Robert G
Zitat:

Zitat von Robert_G
Objects ist, genau wie Tag, nur eine Art Hilfe für Quick'nDirty-Lösungen. Wenn es mal husch-husch gehen muss.

Doch selbst mit wenig Erfahrung in objektorientierter Programmierung solltet ihr in wenigen Stunden eine eigene Grid-Ableitung hinbekommen können.

Das verwirrt mich auch wieder. Die Object-Eigenschaft verwende ich auch oft. Zwar nicht im Stringgrid, mehr bei Listviews und Listboxen. Ok, wenn ich eine Objectlist verwende, leite ich die auch ab und überschreibe die Items-eigenschaft, um mir im eigentlichen Code den Typecast zu sparen und es dort übersichtlicher zu machen. Aber bei den Komponenten lasse ich das immer. Ich erstell mir nur eigene Komponenten, die ich wirklich über mehrere Forms verwende bzw wo ich auch viele Ereignisse verwende.
Wenn ich jedes Mal eine eigene Komponente ableite, sehe ich die Gefahr, das ich mich dann überhaupt nicht mehr in der Komponentenleiste zurechtfinde. Da sind so schon genug Einträge drin. Und nach einem Jahr weiß ich dann auch nicht mehr, für welches Projekt ich welche Komponente benötigt habe und für was die da eigentlich gedacht war. Das nächste ist die Weitergabe eines Projektes, da muß man ja höllisch aufpassen, das man auch ja alle erforderlichen Komponenten mitgibt und muß sie auch noch extra auf dem anderen Rechner installieren. Selbst mit 2 Benutzern auf einem Rechner hat man da schon seine Problemchen. Da laß ich die geänderten Eigenschaften lieber im Code selbst.
Wie organisierst du das?

Mfg Frank

plautzer 24. Feb 2005 22:15

Re: Property "Objects" im Stringgrid
 
Die While-schleife ist mir einfach lieber, hast recht es ist das gleich, aber egal.. ändert ja nichts am problem. Die fehlermeldung ist wie häufig ne Zugriffsverletzung und kommt an dieser Stelle:

Delphi-Quellcode:
k:=1;
while k < grd+1 do
  begin
   for i :=grid[k].FixedCols to grid[k].ColCount-1  do //<--- Fehlermeldung
    for j := grid[k].FixedRows to grid[k].RowCount-1  do
       if zelle.editiert = true then
          begin   // wenn die zelle editiert wurde, dann mache was z.b. speichere
          zelle.editiert:=false;
          showmessage(inttostr(zelle.reihe));
          end;
    k:=k+1;
    enD;

Das objekt 'Zelle' setzt ich bei erstellen und einlesen der Grids:

Delphi-Quellcode:
  k:=0;
  While K < ibDataset2.RecordCount do
  Begin
   grid[grd].RowCount := grid[grd].RowCount +1;
   grid[grd].Cells[1,k+1]:=ibdataset2.fieldbyname('ablese_nr').AsString;
   grid[grd].Cells[2,k+1]:=ibdataset2.fieldbyname('ablesedatum').AsString;
   AddObjectToGrid(1, k+1, ibdataset2.fieldbyname('ablese_nr').AsInteger, grid[grd]);
   AddObjectToGrid(2, k+1, ibdataset2.fieldbyname('ablese_nr').AsInteger, grid[grd]);
   ibdataset2.Next;
   k:=k+1
  end;
Und bei keypress wird Zelle.editiert von auf true gesetzt (false ist defaukt)

Robert_G 24. Feb 2005 22:27

Re: Property "Objects" im Stringgrid
 
Zitat:

Zitat von Keldorn
Wie organisierst du das?

Man kann Delphi mit mehreren Profilen auf einem System verwenden.
Probier's selbst: [WindowsTaste+R] und ...
Code:
delphi32 -rTest
... eintippen.
Jetzt startet Delphi mit den Standardeinstellungen. So hast du eine "eigene" IDE für jedes größere Projekt. ;)
Einfach eine Verknüpfung mit delphi32 -r[Profilname] benutzen.
Außerdem habe ich meine Klassen in Packages gepackt. Somit konnte ich projektbezogene von projektübergreifenden Packages ganz gut unterscheiden. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Seite 2 von 2     12   

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