![]() |
StrinGrid (goRowSelect) zelleneintrag in ein form laden
Ich habe eine Tabelle, die nur Zeilenweise markiert werden kann. in einem anderen formular werden daten in edit-felder eingetrage und in die tabelle auf dem mainform übertragen. für jeden eintrag schreibt er eine neue zeile. wenn man einen bestehenden eintrag auf rechtsklick(popup-menu) "Eintrag bearbeiten" klickt, soll das eingabe-formular wieder aufgerufen werden und dort wieder die entsprchenden daten der angeklickten zeile wieder in die edit-felder geschrieben werden. hintergrund ist, die bereits erstellten einträge zu ändern und wieder in die tabelle zu übernehmen.
uff Irgentwelche vorschläge? Grüße, dopeline |
Hi,
wie währe es denn damit ???
Code:
ungetestet ..., sollte aber so gehen
// Holt die Daten aus der 2. !!! Spalte des Stringgrids in der ausgewälten
// Reiche in das Edit edit1.text :=Stringgrid1.Rows[Stringgrid1.Row].Strings[1]; Gruß Neo PS: Mit 17 Delphi 7.0 Enterprise.... Ihr seid bestimmt ganz schlimm reich :lol: |
das funktioniert schon mal! wenn ich die erste zeile markiere und auf den button klicke, steht in dem editfeld der string (zeile 1 spalte 2)
aber wie veralgemeinere ich das (das es mit allen spalten (und allen editfelder(es sind mehrere>> name, adresse, telefon...) klappt)? |
hat sich schon erledigt! hab es gefunden:
Code:
Trotzdem DANKE!!!
FormNeuerEintrag.EditName.Text :=Stringgrid1.Rows[Stringgrid1.Row].Strings[0];
FormNeuerEintrag.EditTelefon.Text :=Stringgrid1.Rows[Stringgrid1.Row].Strings[1]; FormNeuerEintrag.EditAdresse.Text :=Stringgrid1.Rows[Stringgrid1.Row].Strings[2]; FormNeuerEintrag.EditMobil.Text :=Stringgrid1.Rows[Stringgrid1.Row].Strings[3]; FormNeuerEintrag.EditMail.Text :=Stringgrid1.Rows[Stringgrid1.Row].Strings[4]; Gruß, dopeline :dancer: |
achso, da ist aber noch eine sache:
wenn ich das bearbeiten-fenster öffne, den eintrag bearbeie und wieder abspeichere, denkt er es sei ein neuer eintrag und erstellt auch einen neuen(neue zeile in der tabelle) :( |
Hi,
das wirst du wohl gar nicht können, da du deine Edit-Felder nicht in einem Array hast.. Die Spalten sind ja nicht das Problem, die kannst du ja in einer for-Schleife durchlaufen. Einzige möglichkeit währe die Edit-Felder dynamisch zu generieren und dann Pointer auf die Edits in einem Array zu verwalten. Gruß Neo |
Hallo,
kehr meine Funktion einfach un :
Delphi-Quellcode:
Stringgrid1.Row bezeichnet immer die markierte Zeile.
Stringgrid1.Rows[Stringgrid1.Row].Strings[1]; :=edit1.text;
Gruß Neo |
ja letzteres funktioniert! jetzt noch eine sache:
gibt es eine möglichkeit abzufragen, wiewiele zeilen der tabelle belegt sind? denn wenn ich eine datei lade, und einen eintrag erstelle, fängt er ganz ober an und ersetzt den schon bestehenden in zeile 1. doch eigentlich sollte er gucken "wielviele zeilen sind schon belegt? >> also ist der nächste eintrag zeile:=zeile+1" (iah hab die variable eingesetzt, dass er bei jedem eintrag eine zeile weiter springt) |
Hi,
StringGrid1.Rows ist dein Freund ;-) Um eine Zeile erweitern : StringGrid1.Rows :=StringGrid1.Rows+1; auf letzte Zeile stellen : StringGrid1.Row :=StringGrid1.Rows-1; Gruß Neo |
Wie jetzt belegt? Nicht leere Zeilen oder was?
Mit RowCount kannst Du jedenfalls die Anzahl der Zeilen abrufen. Um auf die letzte Zeile des StringGrids zuzugreifen nimmst Du dann
Delphi-Quellcode:
.
StringGrid1.RowCount - 1
|
irgentwie geht das nicht. also so hab ich es bisher geregelt, dass immer die näschste zeile beschrieben wird:
"anzahl" wird zum programmstart auf 0 gesetzt und immer, wenn man einen neuen eintrag erstellt umd 1 erhöht (>> somit geht er immer eine zeile weiter)
Delphi-Quellcode:
(des ist der auszug aus dem Formular "NeuerEintrag")
inc(anzahl);
FormHaupt.stringgrid1.cells[0,anzahl]:= person.name; FormHaupt.stringgrid1.cells[1,anzahl]:= person.telefon; FormHaupt.stringgrid1.cells[2,anzahl]:= person.adresse; FormHaupt.stringgrid1.cells[3,anzahl]:= person.mobil; FormHaupt.stringgrid1.cells[4,anzahl]:= person.mail; close; wenn ich aber eine bestimmte zeile anklicke und bearbeite geht das so:
Delphi-Quellcode:
er öffnet das formular "NeuerEintrag" und läst in die editfelder die strings aus der tabelle im hauptformular. wenn ich dann auf speichern klicke, wird der veränderte eintrag nicht in die zeile geschrieben, aus der er ausgelesen wurde, sondern an eine andere position (je nach dem welchen wert "anzahl" gerade hat)
FormHaupt.Stringgrid1.Rows[FormHaupt.Stringgrid1.Row].Strings[0]:=EditName.Text;
FormHaupt.Stringgrid1.Rows[FormHaupt.Stringgrid1.Row].Strings[1]:=EditTelefon.Text; FormHaupt.Stringgrid1.Rows[FormHaupt.Stringgrid1.Row].Strings[2]:=EditAdresse.Text; FormHaupt.Stringgrid1.Rows[FormHaupt.Stringgrid1.Row].Strings[3]:=EditMobil.Text; FormHaupt.Stringgrid1.Rows[FormHaupt.Stringgrid1.Row].Strings[4]:=EditMail.Text; |
Hallo,
für was braust du "Anzahl". Die Anzahl der Zeilen im Grid kannst du mit Grid.RowCount ermitteln. Code für neue Zeile :
Code:
Code für Edit
// Zeile hinzugügen
grid.RowCount :=Grid.RowCount+1; // neue Zeile füllen grid.cells[0,grid.rowcount-1]:= EditName.Text;
Code:
hilft das ???
// aktuelle Zeile steht in Row
EditName.Text :=grid.cells[0,grid.row]; // und zurück uns Grid grid.cells[0,grid.row] :=EditName.Text; Im übrigen schreit das was du da gerade machst nach einer kleinen Datenbank ! Da hättest du diese Probleme gar nicht. Gruß Neo |
ok, das geht schon mal so halbwegs. nur noch ein paar kleinigkeiten:
ich erstelle einen eintrag (>> FormNeuerEintrag.ShowModal >>alle Edit-Felder werden geleert >>wieder beschrieben >> speichern >>eintrag erscheint in der tabelle) diesen eintrag bearbeite ich (>> Zeile in die Editfelder einlesen >> FormNeuerEintrag.ShowModal >> eingaben in den edit-feldern werden umgeschrieben >> speichern >> vorhandener eintrag wird durch den barbeiteten ersetzt) soweit funktioniert alles. aber wenn ich nun auf neuen eintrag klicke, erscheint das fenster, aber die edit-felder sind nicht geleert. ich ersetze den text in den feldern mit einem neuen und klicke auf speichern und er erstellt auch eine neue zeile. das problem ist einfach, nach dem bearbeiten und neuem erstellen leert er trotz anweisung die editfelder nicht :( . woran liegt das? und zweitens. ich hab es so eingebaut, dass wenn man auf "neu" klickt, die gesamte tabelle (spaltenbeschriftungen ausgenommen) gelöscht werden soll. (es sollen wirklich die zeilen entfernt werden und nicht nur "geleert"). wie mache ich das? Grüße, dopeline |
also das erste problem (mit den edit-feldern usw.) habe ich schon gelöst
--> die lösch-befehle standen an der falschen stelle :wink: |
Hallo,
für dieses Projekt kommt meine Anmerkung ja wahrscheinlich zu spät, aber mir scheint die Verwendung der Datenbankfunktionen würde das alles sehr vereinfachen, wenn Du meinst eine richtige Datenbank wäre mit Kanonen auf Spatzen schießen, was her sein kann, dann verwende InMemory Datasets, z.B. TClientdataset : Borland (hast Du in deiner Delphi Version, haben hier aber auch Nachteile) oder TDXmemdataset : Developers Express (sind glaube ich free) oder TRxMemoryDataset :Rx-Komponenten (sind sicher free) Hiermit kansst Du die Daten einer Tabelle mit einem Befehl in eine Datei schreiben und wieder lesen, und das ganze Handling dieser Daten in der Anwendung, inclusive der Synchronisation der Editfelder mit dem Grid übernehmen dann die Komponenten für Dich. Grüße Wolfgang |
Hi,
um die Zeilen aus dem grid zu entfernen :
Delphi-Quellcode:
Vorher solltest du aber die Zellen wirklich mit einem leeren String überscheiben (machst du ja schon), denn das Grid entfernt die Zeilen nicht wirklich und sonst würdest du bei einem neuen Eintrag wieder den alten Kram sehen.
Grid.RowCount=1;
Im übrigen kann ich mich der Meinung von WOKI nur anschliessen. So was hat man in 5 Minuten "zusammengeklickt" ;-) Gruß Neo |
also von den datenbanken lass ich erst mal die finger...
dieses programm ist eine aufgabe aus informatik. und wenn ich da mit ner datenbank ankomme, darf ich denen das alles erklären (und was man selbst nicht verstanden hat, erklärt sich schlecht.) außerdem ist das mein erstes jahr informatik. und dort gleich mit datenbanken anfangen? ich weiß nicht... Gruß, dopeline |
Ah! ok, das funktioniert, danke
|
jetzt ist es allersingd so, dass wenn ich die zeile der spalten-überschriften anklicke/markiere und auf bearbeiten klicke, kann ich diese bearbeiten. das darf aber nicht sein! kann ich irgentwo definieren, dass, wenn die oberste zeile markiert ist, er das bearbeiten-fenster nicht öffnet? oder besser wäre noch, wenn man die oberste zeile gar nicht erst markieren könnte! ist sowas möglich?
Gruß, dopeline |
Hi,
stell Grid1.RowCount beim leeren auf 2, dann hast du eine leere Zeile die der Anwender bearbeiten kann. Wenn du Rowcount auf 1 stellst, wird die Eigenschaft FixedRows auf 0 gesetzt, daher rührt dein Probelm. Ansonsten hilft dir sicherlich folgendes :
Delphi-Quellcode:
Gruß Neo
if Grid1.Row>0 then //Edit oder Insert oder was weis ich
|
Ah! Danke Neo2084!
Delphi-Quellcode:
funktioniert super. man kann die zeile zwar anklicken, sie aber nicht mehr bearbeiten.
if StringGrid1.Row>0 then
Gruß, dopeline |
Hi, freut mich ...
Bekommen wir hier deine "Hausaufgabe" zu gesicht, wenn sie fertig ist ??? Gruß Neo |
Liste der Anhänge anzeigen (Anzahl: 1)
wieso nicht? naklar!
ihr könnt auch schon eine "beta"-version sehen! sie kann: -einträge schreiben/bearbeiten -alles in einer datei abspeichern (mit savedialog versteht sich) -und auch dateien öffnen -die tabelle nach excel exportieren (.csv) -die Tabelle drucken was noch dazukommt: -aus excel importieren -einträge/zeilen löschen -sortieren -durchsuchen und zum gefundenen eintrag springen -und noch ein paar andere erweiterungen, die mir später noch -und die fehler werden auch noch ausgemerzt einfallen :wink: ich hab sogar schon eine hilfe/doku dazu geschrieben! Grüße, dopeline :dancer: |
Hi,
dein Fehler beim öffnen rührt daher, das du den begin/end-Block vergessen hast. Wenn du den Quelltext einrücken würdest, hättest du das sicherlich bemerkt ... Ansonsten sieht das doch gar nicht so schlecht aus. Achso, wenn man den Quelltext im Programm (lustig :bounce2: ) auch markieren könnte und kopieren, hätte ich die hier auch die Stelle mit dem Fehler zeigen können, aber so mußt du selbst suchen :cry: Und noch was, Export nach Excel geht auch über OLE, allerdings muß dann Excel auf dem Rechner installiert sein. Gruß Neo PS: Ganz schön gemein, über anderen Sourcecode zu lästern, aber da müssen wir durch ! |
Also ich weiß wirklich nicht, wo du meinst...
ich hab das markieren/kopieren freigeschaltet und ne neue version hochgeschickt |
Hallo,
ich hab meine einfügungen mit //neu markiert :
Delphi-Quellcode:
Wenn du kein beginn/end verwendest, wird nur die nächste Quelltextzeile (F.LoadFromFile(OpenDialog1.FileName);) mit der IF-Bedingung verknüpft.
procedure TFormHaupt.Oeffnen1Click(Sender: TObject);
var F: TStringList; i: Integer; begin F := TStringList.Create; try if OpenDialog1.Execute then begin // neu F.LoadFromFile(OpenDialog1.FileName); StringGrid1.RowCount := StrToInt(F[0]); StringGrid1.ColCount := StrToInt(F[1]); for i := 0 to (StringGrid1.RowCount - 1) do StringGrid1.Rows[i].CommaText := F[i + 2]; end; //neu finally F.Free; end; end; In deinem Fall wird also bei Abbruch des Dialoges mit der Zeile
Code:
fortgefahren und da ja nichts in die Stringlist geladen wurde, gibt es dann halt "mecker" ;-)
StringGrid1.RowCount := StrToInt(F[0]);
Und noch was : Warum kann ich dein Hauptfenster nicht verschieben, verkleinern etc. ?? Gruß Neo |
Hallo. Schönes Programm. Hier noch ein paar anregungen:
Füge in Spalten, wo der text zu lang ist, ein Hint hinzu, dass man auch längere Einträge lesen kann. Besonders bei einer längeren E-Mail Adresse ist das Problematisch, wenn man die Hälfte nicht lesen kann. Und hints solltest du vielleicht auch den Buttons hinzufügen. Die meisten erklähren sich zwar selber, wäre aber glaub ich noch ein Stückchen übersichtlicher. Sonst, schönes/nützliches Programm man liest sich, Stanlay 8) |
Ah, noch was. Wenn ich einen neuen Eintrag hinzufüge, schreibt er die in die Überschriften Zeile wo sonst, E-Mail, Telefonnummer und so steht. Und das mit dem Suchen, klappt bei mir leider nicht so richtig.
Man liest sich, Stanlay 8) |
Jo super! Das läuft ja, wie am schnürchen! danke!
|
die spaltenbreite kann ich aus irgenteinem grund nicht mehr verändern :?
und das mit den hints: Zitat:
Zitat:
Gruß, dopeline |
Hallo,
zum Thema Spalten sortieren und Zeilen aus deinem Grid löschen empfehle ich dir einen Blick auf folgendes : Class: TSortGrid Copyright © 1996 Author: Bill Menees bmenees@usit.net, ![]() Gruß Neo |
Zitat:
![]() Grüße, dopeline |
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, hatte ich direkt aus der Unit kopiert ...
ich habe hier aber eine tZipMaster Komponentensammlung, da ist tSortGrid mit drin. Die leg ich bei. Im Install.txt steht, wie du die Komponenten installieren mußt. Gruß Neo |
wow! die sortgrid komponente ist ja riesig!!! :shock:
sicher, dass ich das alles brauche? irgentwie funktioniert das mit der komponente nicht. er meckert andauernd rum. bestimmt ne 4tel a4-seite mit fehlermeldungen :( gibt es da irgend einen trick? |
Hi,
du mußt ja nicht alles installieren, schau mal in die Unit mit der tSortGrid-Komponente. du benötigst lediglich folgende Dateien : SortGrid.pas, SortGrid.res, SortGridPreview.pas, SortGridPreview.dfm und DefaultSort.res. Diese solltest du in eine Package stecken und in die IDE einbinden. Wenn du Fehlermeldungen hast, müstest du die hier auch posten, sonst kann man dir nicht helfen. Wie man Komponenten in die IDE installiert, dafür gibt es hier im Forum bestimmt 1000 Fragen und Antworten :wink: Gruß Neo |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen! :o
hab noch ein paar funktionen eingebaut (sortieren, suchen) und wollte euch die überarbeitete version zeigen :wink: ich habe aber noch eine frage zum suchen: also, er sucht den eintrag und findet ihn auch (sagt in showmessage die zeile an, in der er steht) aber wie richte ich es ein, dass er direkt zu dieser zeile springt und diese als gesamtes (nicht nur die zelle) markiert? Grüße, dopeline :dancer: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 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