Autor Beitrag
Carola82
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 18.06.03 00:15 
Hi ihr alle,

ich beschäftige mich gerade mit Arrays (statische) und Records und hab da ein paar Fragen:

Was bringt so ein REcord eigentlich? Mann kann damit scheinbar var von verschiedenen Typen zusammenbringen...
z.B.:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
type AdressRecord = record 
name: string
plz: integer; 
var adressen: AdressREcord;

Der Zugriff erfolgt z.B.: mit
ausblenden Delphi-Quelltext
1:
adressen.name:='Mayer';					

Was mir jetzt so vorschwebt ist ein kleines Programm, bei dem ich einfach mehrere verschiedene WErte (also verschiedene Var.typen) nur durch ein Komma getrennt, eingeben kann:

z.B.:
ausblenden Delphi-Quelltext
1:
2:
writeln('GEben sie den NAmen und die PLZ ein!'
readln(Adressen.name, Adressen.plz);

--------> das geht aber nicht!!!
Wie könnte ich das realisieren???
Ich habe schon an mehrdimensionale Arrays gedacht, aber die gehen ja auch nur bei gleichen Var.typen.......?!?!?!

Wäre um jeden Hinweis dankbar! :-)

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
Nimloth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 18.06.03 08:48 
Hallo

"Das geht irgendwie nicht" Das heisst konkret?

Also bei Records muss du immer zuerst noch speicher allozieren, bevor du sie benutzen kannst...
(Natürlich auch bei Objekten)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
 PAdressRecord = ^TAdressRecord;
type TAdressRecord = record   //Typen haben immer ein "T" vorne am  Namen
  name: string;  
  plz: integer;  
  var adressen: PAdressREcord;  //LinkedList?
end

procedure EtwasTunMitdemRecord;
var
  PRec: PAdressRecord;
begin
  New(PRec);
  try
    ....//Arbeiten mit dem Record
  finally
    Dispose(PRec); //Speicher wieder frei geben
  end;
end;

Hoffe das hilft dir etwas weiter...

Grüsse

P.S. Hab den Code aus dem Kopf getippt, kann sein das es nocht einige Tipp Fehler drin hat...
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 18.06.03 09:13 
Hallo!

Nimloth hat folgendes geschrieben:
Also bei Records muss du immer zuerst noch speicher allozieren, bevor du sie benutzen kannst...

Also das wäre mir neu. Wenn ich ein Rekord defeniere und eine Variable (so wie von Carola oben angegeben) definieren kann ich auch das Rekord benutzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Type
  tAdresse = Record
      Name: String;
      Ort: String
    End;

Var 
  Adr: tAdresse;

{...}

Adr.Name := 'Tino'
Adr.Ort := 'Greven';

Das sollte funktionieren.

Gruß
Tino
Nimloth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 18.06.03 09:38 
Hallo

Ja das stimmt, wenn nur primitive Typen im Record enthalten sind geht das. Aber wenn wir eine Referenz auf ein andere Record Instanz wollen, so brauchen wir einen Zeiger darauf, und so sind wir wieder bei meinem Vorschlag... oder etwa nicht? *?* (weiss zumindist keinen andern Weg)

Grüsse
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 18.06.03 10:43 
Und wo steht, das wir eine Referenz brauchen/wollen? Du scheinst da irgendetwas durcheinander zu bringen. Es geht nicht um verkettete Listen. Es geht um statische Arrays und Records, also in der Form
ausblenden Quelltext
1:
var Adressen:Array[0..100] of TAdresse;					


Das ist das Problem:
Zitat:
Was mir jetzt so vorschwebt ist ein kleines Programm, bei dem ich einfach mehrere verschiedene WErte (also verschiedene Var.typen) nur durch ein Komma getrennt, eingeben kann

, aber die Werte sind auch noch unterschiedlicher Natur, mal Integer, mal String.
Entweder man liest also die Werte der Reihe nach ein, oder man liest einen temporären String ein, den man dann selbständig zerteilen und den einzelnen Variablen zuweisen muss (siehe StrToInt, Copy & Pos in der Hilfe).

Cu,
Udontknow
Nimloth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 18.06.03 11:50 
Hallo

Hmm stimmt wohl...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type AdressRecord = record  
name: string;  
plz: integer;  
var adressen: AdressREcord;


falsch verstanden. Sorry...

Naja, schön das ich das mit dem Referenzen und so erwähnt habe :-(
(Mehr Infos als verlangt, gut oder schlecht?)

Grüsse
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 18.06.03 12:05 
naja, bis auf ein wenig Verwirrung wird es wohl kaum Schaden angerichtet haben... :wink:

Cu,
Udontknow
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mi 18.06.03 14:14 
Da du der 3000'ste Mitglied bist, habe ich ein wenig Code für dich. Bedenke bitte, daß ich vom Hause aus faul bin und deshalb alle Möglichkeiten nutze die Delphi bietet. Das sage ich nur, weil die Methode gleich zwar OK ist, aber nicht die hohe Kunst der Programmierung.

Ich hab mir zunutze gemacht, daß TStringList eine Möglichkeit bietet Kommagetrennte Strings zu zerlegen. Wenn man es selbst macht, so ist es auch nicht viel mehr Arbeit, aber da muß man anfangen zu programmieren ;)

Es ist nicht die Antwort auf deine Frage, aber anders geht es sovieso nicht. Zumindest nicht mit ReadLn. Man nuß schon von Hand alles zerlegen.

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:
program Project1;
{$APPTYPE CONSOLE}

uses
  Windows, Classes, SysUtils;

type TAdressRecord = record
    name: string;
    plz: integer;
  end;

var
  s: String;
  sl: TStringList;
  Adressen: TAdressREcord;

begin
  writeln('Geben sie den Namen und die PLZ ein! (getrennt durch Komma)');
  readln(s);

  sl := TStringList.Create;
  try
    sl.CommaText := s;
    if sl.Count <> 2 then
    begin
      MessageBox(0'Fehler bei der Eingabe'nil0);
      Halt;
    end;
    Adressen.name := sl[0];
    Adressen.plz := StrToIntDef(sl[1], -1);
  finally
    sl.Free;
  end;

  writeln('Die Eingaben waren:');
  writeln(Adressen.name);
  writeln(IntToStr(Adressen.plz));
  readln;
end.

_________________
Popov
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 18.06.03 14:28 
Hallo,
Carola82 hat folgendes geschrieben:
z.B.:
ausblenden Delphi-Quelltext
1:
2:
writeln('GEben sie den NAmen und die PLZ ein!'
readln(Adressen.name, Adressen.plz);

--------> das geht aber nicht!!!


Schreibst du eine Konsolenanwendung, das du ReadLn Verwenden Willst?
Für Windows-Anwendungen gibt es diesen Befehl nicht mehr zur eingabe von der Tastatur.
Auch bei Konsolenanwendungen müsstest du jeden Wert einzeln entgegen nehmen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
writeln('Geben sie den Namen ein!'
readln(Adressen.name);
writeln('Geben sie die PLZ ein!'
readln(Adressen.plz);

Bei Windows Anwendungen hast du fpr gewöhnlich Eingabefelder, die Musst du dann (z.B. wen der User auf den Übernehmen Knopf Klickt) deinem Recort zuweisen:
ausblenden Delphi-Quelltext
1:
2:
Adressen.name := edit1.Text;
Adressen.plz := Edit2.Text;


Auf dieser Seite findest du ein kleines Beispielprogramm, das Daten in ein Record übernimmt und diese auf Festplatte speichert und daraus läd. Es heißt TypeFileDemo.
Vieleicht hilft dir das ja ein wenig beim verständnis der Thematik.

Gruß
Klabautermann
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 19.06.03 21:01 
Zitat:

Auch bei Konsolenanwendungen müsstest du jeden Wert einzeln entgegen nehmen

nicht umbeding man kann ja auch einfach machen:
"Geben Sie bitte Ihren Namen und Nachnamen getrett duch einen , ein" so nach diesem schma ist zwar keine gute lösung, aber dafür ist es eine lösung oder ?
muss dann nur noch sowas wie einen getTcken haben

@Carola82
ist deine Fragen beantwortet ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 19.06.03 22:14 
Mimi, wenn du dir Carola82s erstes Posting durchliest, dürfte dir eine verblüffende Ähnlichkeit mit deiner Feststellung auffallen... :wink:

Zitat:
... bei dem ich einfach mehrere verschiedene WErte (also verschiedene Var.typen) nur durch ein Komma getrennt, eingeben kann ... Wie könnte ich das realisieren???


Cu,
Udontknow
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 19.06.03 22:23 
lol, habe ich übersehen:)
ok hier kommt dann ebend die antwort:
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:
function GetToken(aString: String; SepChar: Char; TokenNum: Byte):String
var 
   Token     : String
   StrLen    : Byte; 
   TNum      : Byte; 
   TEnd      : Byte; 

begin 
  StrLen := Length(aString); 
  TNum   := 1
  TEnd   := StrLen; 
  while ((TNum <= TokenNum) and (TEnd <> 0)) do begin 
    TEnd := Pos(SepChar,aString); 
    if TEnd <> 0 then begin 
      Token := Copy(aString,1,TEnd-1); 
      Delete(aString,1,TEnd); 
      Inc(TNum); 
    end else Token := aString; 
  end

  if TNum >= TokenNum then 
    Result := Token 
  else begin 
    MessageDlg('Fehler: Tokennummer(' + aString + ' )ist größer als token !',mtError, [mbok], 0); 
    Result := 'Fehler: Tokennummer(' + aString + ' )ist größer als token !'
  end
end

function getWerte(werte:String;index:Integer);
var
  i:Integer;
begin
  result:=GetToken(werte,',',index);
end;

// Beispiel:
procedure test;
var
  str:String;
begin
  str:='Michael,Springwald,Telefon,Hausnummer';
  Showmessage('Dein Vornamen lautet: '+ getWerte(str,1) );
end;

so das sollte funktionieren.(ungetestet:)

_________________
MFG
Michael Springwald, "kann kein englisch...."