Autor |
Beitrag |
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 12.11.14 12:15
Hallo Leute,
habe mal wieder ein Problem. Es geht diesmal um zwei Buttons (Vor) und (Zurück).
Ich habe 3 Felder in dem einmal ein Name, Vorname und Alter eingegeben werden. Diese werden dann in einem Memofeld eingetragen.
Wenn ich am Hinzufügen klicke dann wird es direkt eingetragen. Nun meine Frage.
Besteht die Möglichkeit wenn ich mehrere Einträge habe, diese mit einem Vor- und Zurückbutton in den jeweiligen Eingabefelder anzuzeigen?
Wenn Ja, wie muss ich da vorgehen. Habe im Internet nichts gescheites gefunden bzw. evtl. ist meine Suchanfrage verkehrt.
Mit freundlichen Grüßen
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mi 12.11.14 12:27
Mir fehlt bei deiner Beschreibung echt die Vorstellungskraft was du genau hast und was du danach haben willst. Evtl. hast du ja mal ein oder zwei Bildchen um den Ist- und Sollzustand des Programms zu beschreiben.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 12.11.14 12:37
Also.
Im Bild 1 Trage ich die Daten ein. Diese werden dann mit dem Button Hinzufügen ins Memofeld eingetragen und dort erscheinen diese sofort. Wenn ich aber mehrere eingetragen habe, will ich mit einem Button (Vor) und einem (Zurück)die Daten vom Memofeld ins die Felder wieder zurück einlesen in die richtigen Spalten logischerweise
Mit freundlichen Grüßen
Einloggen, um Attachments anzusehen!
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: Mi 12.11.14 13:13
Die Grafik ist sehr nichtssagend. Interessand wäre, wie Du die Daten im Memo ablegst.
Etwa so:
Name, Vorname, Alter?
Dann hilft Dir die Stringverarbeitung weiter (String in Teilstrings zergegen und zurückschreiben).
Lade doch mal Dein bisheriges Projekt oder einen Screenshot des laufenden Programms mit ein paar eingetragenen Daten hoch.
Eventuell versteht man dann Dein Problem besser.
ub60
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mi 12.11.14 14:06
Und dann käme da noch die Frage auf, was denn mit den Daten in dem Memo passieren soll, denn ich kann mir ja kaum vorstellen, dass die dann einfach verworfen werden.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 12.11.14 14:07
Ok. Dann nochmal so.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184:
| unit bBuecherverwaltung;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids;
const pmax = 1000000; type TFormBuecherverwaltung = class(TForm) LabelBuchtitel: TLabel; LabelISBNummer: TLabel; LabelAutor: TLabel; LabelErscheinungsjahr: TLabel; EditBuchtitel: TEdit; EditAutor: TEdit; EditErscheinungsjahr: TEdit; EditISBNummer: TEdit; BitBtnHinzufuegen: TBitBtn; BitBtnLoeschen: TBitBtn; StringGridBuecherverwaltung: TStringGrid; BitBtnZurueck: TBitBtn; BitBtnVor: TBitBtn; BitBtnSchliessen: TBitBtn; BitBtnSuchen: TBitBtn; MemoBuecherverwaltung: TMemo; ListBoxBuecherverwaltung: TListBox; procedure FormCreate(Sender: TObject); procedure BitBtnLoeschenClick(Sender: TObject); procedure BitBtnHinzufuegenClick(Sender: TObject); procedure BitBtnZurueckClick(Sender: TObject); procedure BitBtnVorClick(Sender: TObject); procedure BitBtnSchliessenClick(Sender: TObject); procedure EditErlaubteZahlenKeyPress(Sender: TObject; var Key: Char); procedure EditErlaubteZeichenKeyPress(Sender: TObject; var Key: Char); procedure BitBtnSuchenClick(Sender: TObject); private public end;
var FormBuecherverwaltung: TFormBuecherverwaltung;
implementation
uses aHaupt, aHauptfenster, sSuchen; {$R *.dfm}
procedure TFormBuecherverwaltung.FormCreate(Sender: TObject); var ls_erscheinungsjahr : Integer; li : Integer;
ls_zeile : string; ls_buch : string; ls_autor : string; ls_isbnummer : string; ls_rest : string; ls_exe : string; ls_exepath : string;
begin ls_exe := Application.ExeName; ls_exepath := ExtractFilePath(ls_exe);
MemoBuecherverwaltung.Lines.LoadFromFile(ls_exepath+'verwaltung\buecher\memofeldbuecher.txt'); end;
procedure TFormBuecherverwaltung.EditErlaubteZahlenKeyPress(Sender: TObject; var Key: Char); begin if not (key in ['0'..'9','.','-', Char(VK_BACK)]) then key := #0; end;
procedure TFormBuecherverwaltung.EditErlaubteZeichenKeyPress(Sender: TObject; var Key: Char); begin If not(key in [#8,#32,#45,#46,#65..#90,#97..#122,#196,#214,#220,#223,#228,#246,#252]) then key := #0 end;
procedure TFormBuecherverwaltung.BitBtnSuchenClick(Sender: TObject); begin FormSuchen := TFormSuchen.Create(application); FormSuchen.Show; end;
procedure TFormBuecherverwaltung.BitBtnHinzufuegenClick(Sender: TObject); var ls_erscheinungsjahr : Integer; li : Integer;
ls_zeile : string; ls_buch : string; ls_autor : string; ls_isbnummer : string; ls_rest : string; ls_exe : string; ls_exepath : string;
begin ls_exe := Application.ExeName; ls_exepath := ExtractFilePath(ls_exe);
MemoBuecherverwaltung.Lines.Add(ls_buch+';'+ls_autor+';'+IntToStr(ls_erscheinungsjahr)+';'+ls_isbnummer); MemoBuecherverwaltung.Lines.SaveToFile(ls_exepath+'verwaltung\buecher\memofeldbuecher.txt');
end;
procedure TFormBuecherverwaltung.BitBtnZurueckClick(Sender: TObject); begin end;
procedure TFormBuecherverwaltung.BitBtnVorClick(Sender: TObject); begin end;
procedure TFormBuecherverwaltung.BitBtnLoeschenClick(Sender: TObject); begin EditBuchtitel.Text := ''; EditAutor.Text := ''; EditErscheinungsjahr.Text := ''; EditISBNummer.Text := ''; end;
procedure TFormBuecherverwaltung.BitBtnSchliessenClick(Sender: TObject); begin FormBuecherverwaltung.Close; end;
end. |
Wenn ich nun die Daten eingeben. Titel, Autor, Jahr, ISBN und auf Hinzufügen klicke, landen diese sofort ins Memofeld. Alles perfekt. Sobald aber zwei und mehr vorhanden sind, soll durch den Button Vor und Zurück, die Daten die im Memofeld sind Reihenweise ind Eingabefeld geholt werden.
Beispiel. Feld ist leer ich klicke auf Vor und ich bekomme die Zeile 1 angezeigt, noch einmal dann Zeile zwei, gehe ich zurück dann wieder Zeile 1.
PS: Nein diese Daten werden nicht verworfen. Die sind in der Textdatei gespeichert.
Mit freundlichen Grüßen
|
|
Sinspin
Beiträge: 1327
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 12.11.14 14:30
Danke, die Grafik ist köstlich, lange nicht mehr so herzlich lachen müssen .
Ein Memo ist für Deinen Fall nicht ganz die passende Komponente. Eine TListBox ist deutlich besser. Die hat eine Eigenschaft namens ItemIndex, den kannst Du durch ancklicken einer Zeile in der Liste ändern oder eben mit Buttons indem du einfach den ItemIndex hoch und runter zählst.
Über die Eigenschaft Items kannst Du dann auf die einzelnen Zeilen, zum Beispiel via ItemIndex, zugreifen. Speichern, laden geht genauso.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 12.11.14 15:13
Das Problem ist, dass ich nicht das ganze zeigen kann.
Es ist zwar nur einige Eingabefelder, aber diese werden in drei verschiedenenen Stellen gezeigt.
Bin ja dabei es zu lernen.
Sodass eins in einem StringGrid ausgegeben wird, das andere in einem Memo und das anderen in einer ListBox.
Nun dachte ich, wenn ich weiß wie das in einem Memo geht, kann ich mir die anderen selber herleiten.
Mit freundlichen Grüßen
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mi 12.11.14 15:36
Trenne Logik und Darstellung. Die Person kann z.B. ein Record und eine Klasse sein, in der die zusammengehörigen Daten abgelegt werden. Verwalten kannst Du sie in einer Liste oder einem Array. Nun musst Du nur noch durch diese Liste/dieses Array navigieren und die Daten zu der Person am aktuellen Index anzeigen. Da ist dann auch egal, ob Du sie in einem TMemo, einer TListBox, einer TListView oder TSuperDuperKannAllesKomponente anzeigst.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 13.11.14 10:26
Guten Morgen Leute,
Habe mich mal umentschieden. Habe das ganze nun in einem StrngGrid gemacht
Habe nun bei diesem Code ein kleines Problem. Ich weiß nicht wo ich den Zähler anbringen muss
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TFormBuecherverwaltung.BitBtnVorClick(Sender: TObject); var li_y : Integer; begin for li_y := 1 to 10 do begin EditBuchtitel.Text := StringGridBuecherverwaltung.Cells[1,li_y]; EditAutor.Text := StringGridBuecherverwaltung.Cells[2,li_y]; EditErscheinungsjahr.Text := StringGridBuecherverwaltung.Cells[3,li_y]; EditISBNummer.Text := StringGridBuecherverwaltung.Cells[4,li_y]; end; end; |
Aktuell ist es so, dass es direkt durchläuft und es mir das Letzte anzeigt. Wie kriege ich nun den Zähler hin, dass er mit mit jedem Klick immer das nächste anzeigt?
Mit freundlichen Grüßen
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 13.11.14 10:47
Der Zähler darf keine lokale Variable sein. Mach mal ein privates Feld daraus, dann kannst Du von überall aus dem Formular darauf zugreifen (obwohl auch das noch ziemlich unsauber ist). Und wie schon gesagt: Controls dienen eigentlich nur der Anzeige von Daten und nicht zur Speicherung derselben. Langfristig wirst Du so keine Freude haben.
|
|
OlafSt
Beiträge: 486
Erhaltene Danke: 99
Win7, Win81, Win10
Tokyo, VS2017
|
Verfasst: Do 13.11.14 11:41
Ich glaube, das kapiert der TE noch nicht, das bisherige sieht aus, als würde er erst 2 Wochen programmieren
Ein Feld ist alles, was in einer Klasse als Variable definiert ist. Alles andere sind Methoden. Soviel zur Namensgebung.
Jetzt bastelst du ein privates Feld:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| type TForm1 = class(TForm) [...] private FSelectedEntry: integer [...] end; |
Weils einem wirklich viel Kopfschmerzen ersprart, initialisierst due dieses Feld im FormCreate mit 0. Frag nicht, tu es.
In deinem ButtonVorClick sieht das dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.ButtonVorClick(Sender: TObject); begin inc(FSelectedEntry); FillEdits; end;
procedure TForm1.FillEdits; begin ISBN.Text:=StringGridBuecherverwaltung.Cells[1,FSelectedEntry]; [...] end; |
Ein privates Feld, das durch die Vor- und Zurück-Buttons verändert wird und zugleich als Index der Zeile im StringGrid dient. Dir wird sicherlich augenblicklich klar, das es totaler Unsinn ist, zum Füllen der Editfelder eine Schleife zu verwenden. Du willst schließlich nur einen Eintrag des StringGrids in deine Editfelder schieben, nicht viele oder gar alle.
_________________ Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Für diesen Beitrag haben gedankt: GiuStyler
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 13.11.14 14:11
Na ja Olaf, zwei Wochen sind es nicht. Ist für mich nur etwas kompliziert die Angelegenheit. Bis jetzt habe ich einfachere Dinge üben bzw. programmieren sollen. Nun ist es eine Mini-Bibliothek die nur zum Testzweck dient. Also die einzelne Befehle zu lernen.
Daher sind alle Werte die ich nutze logisch und nicht unvorhersehbar. Das heißt es werden nicht viele Datensätze das ich beispielweise eine DB brauche, das wird noch kommen xD
Aber zu meinem Problem. Nachdem ich fast zwei Stunden es versucht habe, hat mein Chef mich "aufgeklärt". Es sieht nun so aus, wobei das ähnlich der Idee von Olaf ist.
Es wurde nun zum ersten global die Werte definiert. Zum einen die Werte die es ablesen muss und zum anderen die max. Datensätze.
Dann wurde eine eigene prozedur erstellt, Aufgrund das ich bei beiden Vorgehen (Vor und Zurück) das gleiche bewirke. Bei Vor wurde dann noch ein +1 eingebaut und bei Zurück ein -1 bzw. in diesem Falle Inc und Dec.
und nun funktioniert es auch wie es soll.
PS: Für die einen mag es einfach sein, aber für mich noch nicht.
|
|
|