Autor Beitrag
GiuStyler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: Mi 12.11.14 14:07 
Ok. Dann nochmal so.

ausblenden volle Höhe 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// Maximale Plätze

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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormBuecherverwaltung: TFormBuecherverwaltung;

implementation

uses
  aHaupt,         // Implementation des ersten Fensters aHaupt beinhaltet Menüleiste
  aHauptfenster,  // Implementation des zweiten Fensters aHauptfenster beinhaltet Button zu Bücherverwaltung & Kundenverwaltung
  sSuchen;        // Implementation des sechsten Fensters sSuchen beinhaltet den Such-Modus für die Bücherverwaltung & Kundenverwaltung

{$R *.dfm}

// ANFANG - Buecherverwaltung-Tabelle Aufbau

procedure TFormBuecherverwaltung.FormCreate(Sender: TObject);
var
  // Deklaration der Integer
  ls_erscheinungsjahr : Integer;
  li : Integer;

  // Deklaration der Strings
  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);

  // ANFANG - Laden des Memofeldes

  MemoBuecherverwaltung.Lines.LoadFromFile(ls_exepath+'verwaltung\buecher\memofeldbuecher.txt'); // Lädt Text, wenn vorhanden

  // Laden des Memofeldes - ENDE

end;

// Buecherverwaltung-Tabelle Aufbau - ENDE

// ANFANG - Erlaubte Zeichen

procedure TFormBuecherverwaltung.EditErlaubteZahlenKeyPress(Sender: TObject; var Key: Char);  // Verhinderung von Ziffern die nicht deklariert sind
begin
  if not (key in ['0'..'9','.','-', Char(VK_BACK)]) then                                      // Nur Zahlen möglich
     key := #0;                                                                               // wenn keine Zahl, dann Feld leer lassen
end;

procedure TFormBuecherverwaltung.EditErlaubteZeichenKeyPress(Sender: TObject; var Key: Char); // Verhinderung von Zeichen die nicht deklariert sind
begin
  If not(key in [#8,#32,#45,#46,#65..#90,#97..#122,#196,#214,#220,#223,#228,#246,#252])       // Nur Zeichen möglich
     then key := #0                                                                           // wenn kein Zeichen, dann Feld leer lassen
end;

// Erlaubte Zeichen - ENDE

// ANFANG - Initialization Suchen

procedure TFormBuecherverwaltung.BitBtnSuchenClick(Sender: TObject);
begin
  FormSuchen := TFormSuchen.Create(application);  // Erstellt das zweite Fenster
  FormSuchen.Show;                                // Gibt das zweite Fenster wieder
end;

// Initialization Suchen - ENDE

// ANFANG - Edit Eingabe Hinzufügen

procedure TFormBuecherverwaltung.BitBtnHinzufuegenClick(Sender: TObject);
var
  // Deklaration der Integer
  ls_erscheinungsjahr : Integer;
  li : Integer;


  // Deklaration der Strings
  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);

  // Eingabe in einem Memofeld
  MemoBuecherverwaltung.Lines.Add(ls_buch+';'+ls_autor+';'+IntToStr(ls_erscheinungsjahr)+';'+ls_isbnummer);
  MemoBuecherverwaltung.Lines.SaveToFile(ls_exepath+'verwaltung\buecher\memofeldbuecher.txt');

end;

// Edit Eingabe Hinzufügen - ENDE

// ANFANG - Seite zurück

procedure TFormBuecherverwaltung.BitBtnZurueckClick(Sender: TObject);
begin
// BAUSTELLE
end;

// Seite zurück - ENDE

// ANFANG - Seite vor

procedure TFormBuecherverwaltung.BitBtnVorClick(Sender: TObject);
begin
// BAUSTELLE
end;

// Seite vor - ENDE

// ANFANG - Editfelder Löschen

procedure TFormBuecherverwaltung.BitBtnLoeschenClick(Sender: TObject);
begin
  EditBuchtitel.Text := '';         // Löscht umgehend das Editfeld "Buchtitel"
  EditAutor.Text := '';             // Löscht umgehend das Editfeld "Autor"
  EditErscheinungsjahr.Text := '';  // Löscht umgehend das Editfeld "Erscheinungsjahr"
  EditISBNummer.Text := '';         // Löscht umgehend das Editfeld "ISBNummer"
end;

// Editfelder Löschen - ENDE

// ANFANG - Bücherverwaltung Schliessen

procedure TFormBuecherverwaltung.BitBtnSchliessenClick(Sender: TObject);
begin
  FormBuecherverwaltung.Close; // Schliesst nur das Fenster "Buecherverwaltung"
end;

// Bücherverwaltung Schliessen - ENDE

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1327
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.ButtonVorClick(Sender: TObject);
begin
  inc(FSelectedEntry);
  //Prüfungen auf Ober- und Untergrenzen nicht vergessen !
  FillEdits;
end;

procedure TForm1.FillEdits;
begin
  //Prüfungen auf Grenzen nicht vergessen !
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 65
Erhaltene Danke: 1

Win 8.1
Delphi XE6
BeitragVerfasst: 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.