Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit Button Vor und zurück
GiuStyler - Mi 12.11.14 12:15
Titel: Problem mit Button Vor und zurück
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 - 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 - 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
ub60 - 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 - 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 - Mi 12.11.14 14:07
Ok. Dann nochmal so.
Delphi-Quelltext
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 - Mi 12.11.14 14:30
Danke, die Grafik ist köstlich, lange nicht mehr so herzlich lachen müssen :rofl: .
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.
GiuStyler - 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 - 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 - 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 - 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 - 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.
GiuStyler - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!