Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Namensprogramm hilfe! (https://www.delphipraxis.net/155756-namensprogramm-hilfe.html)

raysto 6. Nov 2010 15:36

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:
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.
Ich hoffe mir kann jemand helfen :)

Mfg

raysto

Luckie 6. Nov 2010 15:44

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.

raysto 6. Nov 2010 15:49

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

Bummi 6. Nov 2010 15:52

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.

DeddyH 6. Nov 2010 15:54

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.

implementation 6. Nov 2010 15:55

AW: Namensprogramm hilfe!
 
Hier mal ein kleiner Pseudocode:
Code:
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
Klarer geworden?

Luckie 6. Nov 2010 16:06

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.

DeddyH 6. Nov 2010 16:19

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 ;)

raysto 6. Nov 2010 16:19

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:
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;
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.
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:
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.
Aufgaben:

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...

implementation 6. Nov 2010 16:32

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 19:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz