Delphi-PRAXiS

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 StrinGrid (goRowSelect) zelleneintrag in ein form laden (https://www.delphipraxis.net/4726-stringrid-gorowselect-zelleneintrag-ein-form-laden.html)

dopeline 9. Mai 2003 21:07


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

Neo2084 9. Mai 2003 21:17

Hi,

wie währe es denn damit ???

Code:
// 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];
ungetestet ..., sollte aber so gehen

Gruß Neo

PS: Mit 17 Delphi 7.0 Enterprise.... Ihr seid bestimmt ganz schlimm reich :lol:

dopeline 9. Mai 2003 21:26

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)?

dopeline 9. Mai 2003 21:29

hat sich schon erledigt! hab es gefunden:
Code:
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];
Trotzdem DANKE!!!

Gruß, dopeline :dancer:

dopeline 9. Mai 2003 21:33

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

Neo2084 9. Mai 2003 21:35

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

Neo2084 9. Mai 2003 21:40

Hallo,


kehr meine Funktion einfach un :
Delphi-Quellcode:
Stringgrid1.Rows[Stringgrid1.Row].Strings[1]; :=edit1.text;
Stringgrid1.Row bezeichnet immer die markierte Zeile.

Gruß Neo

dopeline 9. Mai 2003 21:57

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)

Neo2084 9. Mai 2003 22:19

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

Marco Haffner 9. Mai 2003 22:19

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
.

dopeline 10. Mai 2003 10:52

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:
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;
(des ist der auszug aus dem Formular "NeuerEintrag")

wenn ich aber eine bestimmte zeile anklicke und bearbeite geht das so:
Delphi-Quellcode:
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;
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)

Neo2084 10. Mai 2003 11:33

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:
// Zeile hinzugügen
grid.RowCount :=Grid.RowCount+1;
// neue Zeile füllen
grid.cells[0,grid.rowcount-1]:= EditName.Text;
Code für Edit
Code:
// aktuelle Zeile steht in Row
EditName.Text :=grid.cells[0,grid.row];
// und zurück uns Grid
grid.cells[0,grid.row] :=EditName.Text;
hilft das ???

Im übrigen schreit das was du da gerade machst nach einer kleinen Datenbank ! Da hättest du diese Probleme gar nicht.

Gruß Neo

dopeline 10. Mai 2003 12:49

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

dopeline 10. Mai 2003 13:05

also das erste problem (mit den edit-feldern usw.) habe ich schon gelöst
--> die lösch-befehle standen an der falschen stelle :wink:

woki 10. Mai 2003 13:06

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

Neo2084 10. Mai 2003 13:19

Hi,

um die Zeilen aus dem grid zu entfernen :

Delphi-Quellcode:
Grid.RowCount=1;
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.

Im übrigen kann ich mich der Meinung von WOKI nur anschliessen.
So was hat man in 5 Minuten "zusammengeklickt" ;-)

Gruß Neo

dopeline 10. Mai 2003 13:39

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

dopeline 10. Mai 2003 13:42

Ah! ok, das funktioniert, danke

dopeline 10. Mai 2003 15:26

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

Neo2084 10. Mai 2003 16:07

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:
if Grid1.Row>0 then //Edit oder Insert oder was weis ich
Gruß Neo

dopeline 10. Mai 2003 16:12

Ah! Danke Neo2084!
Delphi-Quellcode:
if StringGrid1.Row>0 then
funktioniert super. man kann die zeile zwar anklicken, sie aber nicht mehr bearbeiten.

Gruß, dopeline

Neo2084 10. Mai 2003 16:44

Hi, freut mich ...

Bekommen wir hier deine "Hausaufgabe" zu gesicht, wenn sie fertig ist ???

Gruß Neo

dopeline 10. Mai 2003 17:06

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:

Neo2084 10. Mai 2003 19:44

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 !

dopeline 10. Mai 2003 19:54

Also ich weiß wirklich nicht, wo du meinst...
ich hab das markieren/kopieren freigeschaltet und ne neue version hochgeschickt

Neo2084 10. Mai 2003 20:05

Hallo,

ich hab meine einfügungen mit //neu markiert :

Delphi-Quellcode:
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;
Wenn du kein beginn/end verwendest, wird nur die nächste Quelltextzeile (F.LoadFromFile(OpenDialog1.FileName);) mit der IF-Bedingung verknüpft.
In deinem Fall wird also bei Abbruch des Dialoges mit der Zeile
Code:
StringGrid1.RowCount := StrToInt(F[0]);
fortgefahren und da ja nichts in die Stringlist geladen wurde, gibt es dann halt "mecker" ;-)

Und noch was :
Warum kann ich dein Hauptfenster nicht verschieben, verkleinern etc. ??

Gruß Neo

Stanlay Hanks 10. Mai 2003 20:10

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)

Stanlay Hanks 10. Mai 2003 20:12

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)

dopeline 10. Mai 2003 20:16

Jo super! Das läuft ja, wie am schnürchen! danke!

dopeline 10. Mai 2003 20:24

die spaltenbreite kann ich aus irgenteinem grund nicht mehr verändern :?
und das mit den hints:
Zitat:

Zitat von Stanlay Hanks
Und hints solltest du vielleicht auch den Buttons hinzufügen.

die hints werden unten in der statusbar ausgegeben. ich finde damit werden die hints, die sonst unter dem button auftauchen, unnötig...


Zitat:

Zitat von Stanlay Hanks
Und das mit dem Suchen, klappt bei mir leider nicht so richtig.

ich habe oben geschrieben, dass die suchfunktion auch erst vorgesehen ist...

Gruß, dopeline

Neo2084 11. Mai 2003 00:56

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, www.public.usit.net/bmenees

Gruß Neo

dopeline 11. Mai 2003 06:33

Zitat:

Zitat von Neo2084
Class: TSortGrid Copyright © 1996 Author: Bill Menees
bmenees@usit.net, www.public.usit.net/bmenees

:?: :?: :?: hier her wird man umgeleitet. muss ich mich dort anmelden? ich finde auf der seite nichts, was mit delphi, geschweige denn mit stringgrids zu tun hat. :?


Grüße, dopeline

Neo2084 11. Mai 2003 09:36

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

dopeline 11. Mai 2003 11:22

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?

Neo2084 11. Mai 2003 12:26

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

dopeline 13. Mai 2003 08:37

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