![]() |
Namensprogramm hilfe!
Hallo,
ich weiß nicht ob ich hier im richtigen Vreich bin, hoffe es aber doch mal :D Also ich habe folgendes Problem: Für die Schule muss ich diese Aufgabe machen: Erstelle ein Programm, wo man in einem Textfeld beliebig viele Namen nacheinander eingeben kann. Die Namen werden nach dem Drücken vom Speichern-Button auf ein Array gelegt. Mit Drücken auf den Ausgabe-Button werden alle bisher eingegebenen Namen Nacheinander in einer Messagebox ausgegeben. Gebe das Programm ab Ich habe jetzt auch schon geschafft, einen Namen zu schreiben und ihn auf den Array zu legen. Auch das ausgeben ist kein Problem. Nur ich weiß jetzt nich wie ich 1. machen soll, dass erst auf (array) Namen[1], dann auf Namen[2], Namen[3] usw. gespeichert wird. 2. machen soll, dass alle Namen die ich eingegeben habe untereinander angezeigt werden. (Showmessage) Oder auch nacheinander. Mein bisheriger Code sieht so aus:
Delphi-Quellcode:
Ich hoffe mir kann jemand helfen :)
unit Kapitel13;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Label2: TLabel; Label3: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Label4: TLabel; procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; namen: array[1..100] of string; namencounter : integer; implementation {$R *.dfm} procedure TForm1.Button3Click(Sender: TObject); begin edit1.Clear; end; procedure TForm1.Button2Click(Sender: TObject); begin showmessage (namen[1]); end; procedure TForm1.Button1Click(Sender: TObject); begin namencounter := namencounter +1; end; end. Mfg raysto |
AW: Namensprogramm hilfe!
Beim speichern musst du eben immer den Index des Arrayelements angeben in dem der Name abgelegt werden soll. Am besten speicherst du den Index des aktuellen Elementes in einer privaten Variable deiner Formklasse. Da würde ich auch das Array ablegen und es nicht global deklarieren.
Zum Ausgeben musst du eine Schleife über das Array laufen lassen. |
AW: Namensprogramm hilfe!
Ich arbeite noch nich so lange mit Delphi. Könntest du mir für das Speichern ein Codebeispiel machen?
Danke im vorraus. Mfg raysto |
AW: Namensprogramm hilfe!
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation Type TNamenArray=Array of String; var NamenArray:TNamenArray; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SetLength(NamenArray , High(NamenArray) + 2); // High eines Leeren Array's ist -1 NamenArray[High(NamenArray)] := Edit1.Text; end; procedure TForm1.Button2Click(Sender: TObject); var i:Integer; begin for I := Low(NamenArray) to High(NamenArray) do Showmessage(NamenArray[i]); end; procedure TForm1.Button3Click(Sender: TObject); var i:Integer; s:String; begin for I := Low(NamenArray) to High(NamenArray) do s := s + IntToStr(i) + ': ' + NamenArray[i] + #13#10; Showmessage(s); end; procedure TForm1.Button4Click(Sender: TObject); begin SetLength(NamenArray,0); // Array leeren end; end. |
AW: Namensprogramm hilfe!
Na, Du hast doch bereits die Variable NamenCounter. Diese setzt Du bei Programmstart auf 1. Speicherst Du nun einen neuen Namen, legst Du ihn im Index NamenCounter des Array ab und erhöhst die Variable anschließend.
|
AW: Namensprogramm hilfe!
Hier mal ein kleiner Pseudocode:
Code:
Klarer geworden?
DU HAST:
- Feld mit Länge 5 vom Typen String - Indexvariable vom Typen Integer ROUTINE Speichern DU HAST DAZU - Name vom Typ String BEGINNE SETZE Feld AN STELLE Indexvariable AUF Name ERHÖHE Indexvariable ENDE ROUTINE AlleAnzeigen DU HAST DAZU - Eine weitere Indexvariable, nennen wir sie i BEGINNE FÜR i MIT JEDEM WERT VON 0 BIS 4 BEGINNE ZEIGE Feld AN STELLE i ENDE ENDE |
AW: Namensprogramm hilfe!
Und hier meine Lösung mit einem statischen Array:
Delphi-Quellcode:
unit Unit11;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const MAXNAMES = 3; type TForm11 = class(TForm) edtName: TEdit; btnSave: TButton; btnShowNameList: TButton; btnClearList: TButton; Label1: TLabel; procedure btnClearListClick(Sender: TObject); procedure btnShowNameListClick(Sender: TObject); procedure btnSaveClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } Names: array[0..MAXNAMES - 1] of string; CurrentIndex: Cardinal; public { Public-Deklarationen } end; var Form11: TForm11; implementation {$R *.dfm} procedure TForm11.btnClearListClick(Sender: TObject); var i: Integer; begin for i := 0 to High(Names) do Names[i] := ''; CurrentIndex := 0; end; procedure TForm11.btnSaveClick(Sender: TObject); begin btnSave.enabled := CurrentIndex < MAXNAMES - 1; edtName.enabled := CurrentIndex < MAXNAMES - 1; Names[CurrentIndex] := edtName.Text; if CurrentIndex < MAXNAMES - 1 then begin Inc(CurrentIndex); edtName.Clear; edtName.SetFocus; end; end; procedure TForm11.btnShowNameListClick(Sender: TObject); var i: Integer; NameList: string; begin for i := 0 to High(names) do begin NameList := NameList + Names[i] + #13#10; end; ShowMessage(NameList); end; procedure TForm11.FormCreate(Sender: TObject); begin CurrentIndex := 0; end; end. |
AW: Namensprogramm hilfe!
2 Dinge dazu: werden lokale Stringvariablen automatisch leer initialisiert? Und selbst wenn, dann würde ich das aus Gewohnheit und gutem Stil geschuldet trotzdem selbst machen. Und wieso verwendet Ihr nicht die Konstante sLineBreak? Ich weiß zwar auch, dass das #13#10 ist, aber das muss man sich ja dann nicht mehr merken ;)
|
AW: Namensprogramm hilfe!
Sry das ich euch nerve, aber ich versteh nur Bahnhof xD
Das Kapitel, mit dem wir Arrays gelernt haben, sieht so aus:
Delphi-Quellcode:
Das obige Bespiel beschreibt ein sogenanntes eindimensionales Array. Manchmal möchte man aber auch Daten 2-dimensional ablegen (also in einer Art Tabelle). Dann kann man sich auch ein 2-dimensionales Array erstellen. Gerade beim Schach würde sich ein 2-dimensionales Array anbieten, da auch die Felder auf dem Schachbrett in mehrere Zeilen und Spalten unterteilt sind. Folgendes Beispeil verdeutlicht die Idee und die dazugehörige Syntax.
Kapitel 13 - Arrays
Manchmal benötigt man ziemlich viele Variablen, dann ist es etwas problematisch immer wieder neue anzulegen. Auch die Mathematik kennt das Problem und benutzt dann statt der Variablen a, b, c, ... die Variablen a1, a2, a3, ... Das gleiche Prinzip kann man auch in der Informatik nutzen. Hier heißen solche indizierten Variablen Arrays. Statt der Variable a, b, c, ... legt man sich hier die Variable a[1], a[2], a[3], ... an. Auch diese Variablen müssen einen bestimmten Typ besitzen. Möchte man sich zum Beispiel die Belegung von einem Schachbrett merken, so kann man sich ein Array vom Typ String anlegen, dass von 1 bis 64 indiziert. var i : integer; var schachbrett: array[1..64] of string; // Legt sich ein Array namens schachbrett vom Typ string an begin // Das Array akzeptiert einen Index zwischen 1 und 64 for i := 1 to 64 do // Gehe alle 64 Felder durch und ... schachbrett[i]:=''; // ... weise diesen einen leeren String zu schachbrett[1]:='Turm'; // Weise dem ersten Feld den Wert 'Turm' zu schachbrett[2]:='Springer'; // usw ... schachbrett[3]:='Läufer'; schachbrett[4]:='Dame'; // ... end;
Delphi-Quellcode:
var i1,i2 : integer;
var schachbrett: array[1..8,1..8] of string; begin for i1 := 1 to 8 do for i2 := 1 to 8 do schachbrett[i1,i2]:=''; schachbrett[1,1]:='Turm'; schachbrett[2,1]:='Springer'; schachbrett[3,1]:='Läufer'; schachbrett[4,1]:='Dame'; end; Wie man sieht hat jetzt das Array zwei Indizies. Sie rechen jeweils von 1 bis 8. So ergeben sich ebenfalls 64 Felder. Der große Unterschied ist, dass man sich do die Lage der Felder besser vorstellen kann und so besser und übersichtlicher programmieren kann. Selbstverständlich kann man auch Arrays mit noch mehr Dimensionen anlegen. Dies kommt aber in der gängigen Programmierpraxis eher selten vor. Weitere Beispiele für Arrays sind:
Delphi-Quellcode:
Aufgaben:
VierGewinntFeld: array[1..7,1..6] of char; // entweder ' ' für leer oder 'g' für gelb, 'r' für rot
Namensliste: array[1..1000] of string; // hier kann man zum Beispiel eine Liste aller Schüler der Schule // oder Klasse anlegen. Man sollte sich dann aber noch eine Variable // NamenslisteCount vom Typ integer anlegen, in der man ablegt, wie // viele Einträge das Array derzeit besitzt. So kann man auch zur // Laufzeit weitere Einträge hinzufügen, so lange man nicht über // 1000 Einträge kommt. UserListe: Array[1...9999] of TUser; // Eine Liste von Usern. Hier gibt es etwas besonderes, TUser ist // ein eigener Datentyp, den man vorher über das Schlüsselword // record angelegt hat. Notiere dir wie immer die wichtige Inhalte in deinem Hefter. Insbesondere die fettgedruckten Wörter sind wichtig. Finde mindestens drei weitere Beispiele für sinnvolle Arrays Erstelle ein Programm, wo man in einem Textfeld beliebig viele Namen nacheinander eingeben kann. Die Namen werden nach dem Drücken vom Speichern-Button auf ein Array gelegt. Mit Drücken auf den Ausgabe-Button werden alle bisher eingegebenen Namen Nacheinander in einer Messagebox ausgegeben. Gebe das Programm ab Da steht von euren Sachen noch gar nichts drin xD Geht das nicht i-wie leichter? Ich bin grad überfordert, sry... |
AW: Namensprogramm hilfe!
Das ist die leichteste Methode die es gibt :gruebel:
Wie stellst du es dir denn vor? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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