Autor Beitrag
kostenix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 17.04.03 00:57 
kann mir wer 2dimensionale arrays erklären?

also zur benutzung...

ich habe zum beispiel folgendes problem:

ich habe eine art adressverwaltung vor zu coden. da habe ich die arrays 0..20 für die listbox items die ich beschreiben will ... (wird alles nur temporär gespeichert.). und ich habe noch 10 editfelder in die chars eingetragen werden können.

ich habe es nun hingekriegt dass er daten in ein array speichert. aber nur von einem editfeld. ich will nun aber von allen 10 editfeldern die daten in einem array gespeichert haben. das müsste doch mit zweidimensionalen arrays funktionieren oder?

hier einpaar codes:

im hauptformular zum speichern der daten:
ausblenden Quelltext
1:
2:
3:
4:
5:
procedure THauptformular.Button_Adresse_speichernClick(Sender: TObject);
begin
Strings_Speichern(Listbox_Eingabe.ItemIndex,Edit_Eingabe_Name.text);
end;
//es wird auf die funktion in der extra_unit zugegriffen

in extra_unit:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TStrings = array[1..20] of String;
var Strings:Tstrings;
//deklaration des array-bereichs/typen

procedure Strings_Speichern(i:Integer;Wort:String);
begin
Strings[i]:=Wort;
end;
//funktion des speichern der daten in einem array

function Strings_Auslesen(i:integer):String;
begin
result:=Strings[i];
end;
//funktion des auslesen der gespeicherten daten bei klick auf listbox item

ich hoffe ihr könnt mir helfen

thx schon mal im vorraus

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
Moderiert von user profile iconTino: Topic gesplittet und verschoben.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 17.04.03 11:22 
Hallo und willkommen in diesem Forum!

Erst einmal ein paar Hinweise, von denen Du Dich bitte nicht abschrecken lässt:
1. Um Code in einem Posting zu kennzeichen, benutze doch demnächst bitte die Code-Tags. Das kannst Du auch noch nachträglich mit der "Edit"-Funktion machen
2. Auch wenn Deine Frage natürlich thematisch zu diesem Tutorial gehört, stelle Deine Fragen doch bitte demnächst, in einer der anderen Abteilungen dieses Forums. Das hilft anderen, Deine Postings wiederzufinden, sollten sie das gleiche Problem haben wie Du.

Und nun zu Deiner Frage:

Ich bin mir nicht sicher, dass ich Dein Problem verstehe. Aber hier schon mal ein paar Anmerkungen, die auf jeden Fall stimmen:
ausblenden Quelltext
1:
2:
3:
4:
type
  TStrings = array[1..20] of String;
var
  Strings:Tstrings;

Da es in Delphi bereits einen Datentypen mit Namen TStrings gibt, würde ich einen anderen Namen suchen, um verwechslungen zu vermeiden.

Und jetzt bin auch schon an dem Punkt angelangt, wo ich Dir nicht weiterhelfen kann: Du hast zehn Editfelder, aber das Array besitzt zwanzig Felder. Waurm das?
Diese Funktion ...
ausblenden Quelltext
1:
2:
3:
4:
5:
procedure THauptformular.Button_Adresse_speichernClick(Sender: TObject);
begin
  Strings_Speichern(Listbox_Eingabe.ItemIndex,Edit_Eingabe_Name.text);
end;
//es wird auf die funktion in der extra_unit zugegriffen

... lässt mich vermuten, dass Du für dieses Editfeld maximal zwanzig Eingaben zulässt.

Wenn ich mal davon ausgehe, dass meine Vermutung richitg ist - damit ich weitermachen kann - brauchst Du jetzt also ein zweidimensionales Array, um die anderen Edit-Felder auch noch unterzubringen.

Also sowas:
ausblenden Quelltext
1:
type teditinhalt = array[1..20,1..10] OF String;					


Nun komme ich aber nochmal auf den bereits erwähnten Datentypen TStrings zurück, und zwar den, den Delphi bereit stellt. Das ist nämlich nichts anderes als eine Liste von Strings, wie sie auch die ListBox verwendet.
Der Datentyp könnte dann so aussehen:
ausblenden Quelltext
1:
2:
type teditinhalt = array[1..10] OF TStrings;
var editinhalt : TEditInhalt;


Dann kannst Du nämlich den Inhalt Deiner Listboxen ganz einfach in einem Array speichern. Denn nach dieser Zuweisung:
ausblenden Quelltext
1:
editinhalt[1]:=Listbox_Eingabe.Items;					

macht Dein Array jede Änderung, die in ListBox_Eingabe stattfindet, mit, ohne dass Du Dich noch darum kümmern musst.

Ich hoffe, ich konnte Dir helfen,
MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
kostenix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 17.04.03 12:17 
erst einmal sorry dass ich mein prob hier im tutorial geposted hab. dachte nur dass wenn wer dieses problem hat es sich auch durch dieses tutorial ansieht ... und da es alles in einem thread iss denk ich mal klickt sich eh jeder durch das ganze tut.

jetzt zu meinem prob...

user defined image
so soll das tool aussehen.

extra unit... in der die funktionen und proceduren stehen müssen!
ausblenden 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:
unit Extra_Unit;

interface

type
  TStrings = array[1..20] of String;
var Strings:Tstrings;

procedure Strings_Speichern(i:Integer;Wort:String);
function Strings_Auslesen(i:integer):String;
//function Alles_Loeschen:integer;

implementation

procedure Strings_Speichern(i:Integer;Wort:String);
begin
Strings[i]:=Wort;
end;

function Strings_Auslesen(i:integer):String;
begin
result:=Strings[i];
end;

end.


haupt unit... in der alles ausgeführt und verlinkt wird auf die prozeduren und funktionen aus der extra unit
ausblenden volle Höhe 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:
unit Hauptprogramm_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Extra_Unit;

type
  THauptformular = class(TForm)

    Button_Adresse_speichern: TButton;
    Button_Adresse_loeschen: TButton;
    Button_Liste_loeschen: TButton;
    Button_Programm_beenden: TButton;

    Edit_Eingabe_1: TEdit;
    Edit_Eingabe_2: TEdit;
    Edit_Eingabe_3: TEdit;
    Edit_Eingabe_4: TEdit;
    Edit_Eingabe_5: TEdit;
    Edit_Eingabe_6: TEdit;
    Edit_Eingabe_7: TEdit;
    Edit_Eingabe_8: TEdit;
    Edit_Eingabe_9: TEdit;

    GroupBox_Eingabe: TGroupBox;

    Label_Eingabe_Name: TLabel;
    Label_Eingabe_Vorname: TLabel;
    Label_Eingabe_Strasse: TLabel;
    Label_Eingabe_Hausnummer: TLabel;
    Label_Eingabe_PLZ: TLabel;
    Label_Eingabe_Wohnort: TLabel;
    Label_Eingabe_Telefon: TLabel;
    Label_Eingabe_Mobilfunk: TLabel;
    Label_Eingabe_Email: TLabel;
    Label_Time: TLabel;
    Label_Date: TLabel;

    ListBox_Eingabe: TListBox;

    Timer_Time: TTimer;
    Timer_Date: TTimer;
    
    procedure Timer_TimeTimer(Sender: TObject);
    procedure Timer_DateTimer(Sender: TObject);
    procedure Button_Adresse_speichernClick(Sender: TObject);
    procedure ListBox_EingabeClick(Sender: TObject);
    procedure Button_Programm_beendenClick(Sender: TObject);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Hauptformular: THauptformular;

implementation

{$R *.dfm}

procedure THauptformular.Timer_TimeTimer(Sender: TObject);
begin
Label_Time.Caption:=TimeToStr(time);
end;

procedure THauptformular.Timer_DateTimer(Sender: TObject);
begin
Label_Date.Caption:=DateToStr(date);
end;

procedure THauptformular.Button_Adresse_speichernClick(Sender: TObject);
begin
Strings_Speichern(Listbox_Eingabe.ItemIndex,Edit_Eingabe_1.text);
end;

procedure THauptformular.ListBox_EingabeClick(Sender: TObject);
begin
Edit_Eingabe_1.Text:=Strings_Auslesen(Listbox_Eingabe.ItemIndex);
end;

procedure THauptformular.Button_Programm_beendenClick(Sender: TObject);
begin
Application.Terminate;
end;


... das sind im moment meine 2 units....

der array bereich 1..20 bezieht sich auf die listbox ... weil die 20 items hat.

die funktionen des programms sollen folgendermaßen ablaufen:

ich such mir in der listbox ein feld aus (klicke es an) und schreibe dann in die editfelder die daten rein. danach klick ich auf "Adresse speichern" und es werden alle editfelder in diesen einem listbox eintrag gespeichert.

das wiederhole ich bei verschiedenen listbox items.

wenn ich dann wieder auf den ersten listbox item klicke, sollen die daten die ich vorher gespeichert habe in allen editfeldern erscheinen.

das habe ich ja auch hingekriegt ... bloß wird da nur das erste editfeld gespeichert und ich weiss ned wie ich das mit allen anderen machen soll.

wenn ich auf "adresse löschen" gehe , dann soll er nur die daten aus den editfeldern löschen auf dem ich mit der listbox bin.

bei "liste löschen" soll er alles löschen und es soll so sein wie bei programm start...[img][/img]
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 17.04.03 12:45 
Ah, so langsam kapiere ich, wie das funktionieren soll.

Erstmal eine Anmerkung:
ausblenden Quelltext
1:
2:
3:
4:
procedure THauptformular.Button_Adresse_speichernClick(Sender: TObject);
begin
Strings_Speichern(Listbox_Eingabe.ItemIndex,Edit_Eingabe_1.text);
end;

Kann nicht immer funktionoeren, denn der ItemIndex einer Listbox beginnt bei Null, der Index Deines Arrays beginnt aber bei Eins. Da wird es zu einem Fehler kommen. Ich würde das Array von 0..19 laufen lassen, dann stimmt es so, wie Du es gemacht hast.

ausblenden Quelltext
1:
2:
3:
4:
procedure THauptformular.Button_Programm_beendenClick(Sender: TObject);
begin
Application.Terminate;
end;

Ich würde statt "Application.Terminante" den Befehl "Close" verwenden.


Okay, du brauchst jetzt also ein 2d-Array. Dann machen wir das so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type
  teintraege = Array[1..9,0..19] OF String;
var
  eintraege = teintraege;

procedure Strings_Speichern(eintrag, feld:Integer;Wort:String);
begin
  eintraege[feld,eintrag]:=wort;
end; 

procedure THauptformular.Button_Adresse_speichernClick(Sender: TObject);
VAR i : INTEGER;
  my_edit : TEdit;
begin
  for i:=1 TO 9 DO
  if FindComponent('edit_eingabe_'+IntToStr(i)) is TEdit then
  begin
    my_edit:=TEdit(FindComponent('edit_eingabe_'+IntToStr(i)));
    Strings_Speichern(Listbox_Eingabe.ItemIndex,i,my_edit.text);
  end;
end;


Die anderen Funktionen kannst Du dann analog ändern. Hast Du schon mal über ein dymamisches Array nachgedacht, damit Du beliebig viele Einträge speichern kannst?

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
kostenix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 17.04.03 12:59 
dynamische arrays hatten wir noch nicht durchgenommen gehabt in der schule ...
kostenix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 17.04.03 13:04 
okay, das funktioniert jetzt denk ich mal soweit.

das prob ist nur noch das auslesen ...

wie würde denn die funktion mit dem auslesen aussehen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 17.04.03 14:17 
Ich denke, dass mit dem Auslesen sollte nicht das Problem sein, der Trick ist der Gleiche, wie beim Schreiben. Versuch mal, wie weit Du kommst und dann helfe ich Dir weiter, okay?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
kostenix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 17.04.03 19:02 
alles klar... werd ich heut nacht ma testen!

danke dir schon mal
kostenix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Fr 18.04.03 00:09 
sorry .. kriegs einfach ned hin .. immer ne andere fehlermeldung...

array-typ erforderlich oder umwandlungsfehler ....

klappt einfach ned... *wein*
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 18.04.03 11:21 
Dann poste doch mal den Code, den Du hast! Ohne den Code, wo die Fehler auftauchen, kann ich Dir nicht helfen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
ShiKai
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56



BeitragVerfasst: So 04.05.03 00:45 
hi, ich glaube, was dein problem ist, ist das 2d-array,

ich würde dir eher zu einem 1d-array, dass aus records
besteht raten.

also z.b.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type
  TAdresse = record
    Name            : String;
    Vorname       : String;
    Strasse         : String;
    Hausnummer : String; //falls sowas wie 21b vorkommt
    Postleitzahl    : String; //falls ne nuller zahl is' 01234
    Telefon          : String; //falls vorwahl-strich '/'
    Mobilfunk       : String; //falls vorwahl-strich '/'
    EMail             : String;
  end;
  TAdressen : array of TAdresse;

var
  Adressen : TAdressen;


jetzt kannst du z.b. (wenn du die länge von Adressen mit
Length(Zahl) auf 1 gesetzt hast.) auf Adressen[0].Name
zugreifen.