| Autor |
Beitrag |
Carola82
Hält's aus hier
Beiträge: 3
|
Verfasst: 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.:
Delphi-Quelltext 1: 2: 3: 4:
| type AdressRecord = record name: string; plz: integer; var adressen: AdressREcord; |
Der Zugriff erfolgt z.B.: mit
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.: 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 Tino: Delphi-Tags hinzugefügt.
|
|
Nimloth
      
Beiträge: 20
|
Verfasst: 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)
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 name: string; plz: integer; var adressen: PAdressREcord; end;
procedure EtwasTunMitdemRecord; var PRec: PAdressRecord; begin New(PRec); try .... finally Dispose(PRec); 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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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:
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
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
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
      
Beiträge: 20
|
Verfasst: Mi 18.06.03 11:50
Hallo
Hmm stimmt wohl...
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mi 18.06.03 12:05
naja, bis auf ein wenig Verwirrung wird es wohl kaum Schaden angerichtet haben...
Cu,
Udontknow
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: 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.
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', nil, 0); 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 18.06.03 14:28
Hallo,
| Carola82 hat folgendes geschrieben: | z.B.: 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:
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:
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
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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...
| 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
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 19.06.03 22:23
lol, habe ich übersehen:)
ok hier kommt dann ebend die antwort:
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;
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...."
|
|
|