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.
|
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:
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:
Tgrid = class(Tstringgrid)
public TableName : string; end; Tzelle = class(tobject) private nr: integer; reihe: integer; editiert: boolean; end;
Delphi-Quellcode:
und so wird sie deklariert:
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;
Delphi-Quellcode:
Ich alles mit einem Objekt 'tgrid' machen?
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); |
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.
|
Re: Property "Objects" im Stringgrid
Hi,
ich habe meine liebe zum array wieder gefunden :mrgreen: das ganze sieht nun so aus:
Delphi-Quellcode:
Per keydown wird das objekt zellen.editiert auf true gesetzt und das will ich dann so auslesen:
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; ...
Delphi-Quellcode:
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.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 Sieht jemand den Grund dafür? Thx, Plautzer |
Re: Property "Objects" im Stringgrid
Hallo
Delphi-Quellcode:
die rows und cols fangen bei 0 an, die letze ist jeweils Anzahl-1
for i :=grid[k].FixedCols to grid[k].ColCount -1 do
for j := grid[k].FixedRows to grid[k].RowCount -1 do Mfg Frank |
Re: Property "Objects" im Stringgrid
Der Fehler bleibt unverändert
Delphi-Quellcode:
Plautzer
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; |
Re: Property "Objects" im Stringgrid
Zitat:
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 |
Re: Property "Objects" im Stringgrid
Zitat:
Delphi-Quellcode:
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?
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.
PLautzer |
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)
|
Re: Property "Objects" im Stringgrid
Zitat:
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. |
Re: Property "Objects" im Stringgrid
Zitat:
|
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 |
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: |
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:
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.
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; Hier ist noch das ganze Problem, es kommt zu fehlermeldung wenn er die schleife das zweite Mal durchläuft. |
Re: Property "Objects" im Stringgrid
@plautzer
Warum Du jetzt eine while Schleife hast, weiß ich nicht. Es ist aber dasselbe wie
Delphi-Quellcode:
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?
For i:=1 to grd do
@Robert G Zitat:
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 |
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:
Und bei keypress wird Zelle.editiert von auf true gesetzt (false ist defaukt)
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; |
Re: Property "Objects" im Stringgrid
Zitat:
Probier's selbst: [WindowsTaste+R] und ...
Code:
... eintippen.
delphi32 -rTest
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. |
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