![]() |
String zu Array ... of Char
Ich fange erst realtiv neu mit Delphi 5.0 an.
Und habe gleich 'n kleines Problem'chen .... Type Test = Record Daten : Array[1..40] of char End; Var Eingabe : File of Test; Versuch : Test; Mit EDIT1.TEXT erhalte ich einen String, der aber in den Record reinkommen soll. So fit bin ich noch nicht, ich weiss nicht wie ? Kann mir jemand dabei helfen ???? :drunken: |
Re: String zu Array ... of Char
Herzlich willkommen in der Delphi-PRAXiS, Gingerbreadman.
Ein Unterschied zwischen deinem (statischen) array of Char und dem String Edit.Text liegt darin, dass bei der Variable Versuch nur der Compiler weiß, wieviele Zeichen hinein passen, während diese Information bei einem String versteckt mit abgespeichert wird. Die Übertragung von Zeichen zwischen Edit.Text und Versuch kannst du Zeichen für Zeichen in einer Schleife oder unter Verwendung von Systemroutinen blockweise vornehmen:
Delphi-Quellcode:
Hoffentlich habe ich nicht zu viele Fehler eingebaut...
var
i: Integer; s: String; begin // zeichenweise s := Edit.Text; for i := Low(Versuch) to High(Versuch) do if i > Length(s) then Versuch[i] := #0 else Versuch[i] := s[i]; // blockweise if Length(s) > Length(Versuch) then Move(s[1], Versuch[1], Length(Versuch)) else begin FillChar(Versuch, Length(Versuch), #0); Move(s[1], Versuch[1], Length(s)); end; end; Freundliche Grüße vom marabu |
Re: String zu Array ... of Char
Also wenn ich das richtig sehe, dann wird der Text im Char-Array nicht immer von einem #0 abgeschlossen, was aber besser wäre und oftmal auh nötig ist -.-''
Delphi-Quellcode:
Dat mit den Fehlern hoffe ich och ma :roll:
var
i: Integer; s: String; begin // zeichenweise s := Edit.Text; for i := Low(Versuch) to High(Versuch) do if i < High(Versuch) then Versuch[i] := s[i] else begin Versuch[i] := #0; break; end; // break kann zwar auch weggelassen werden, aber warum nicht abbrechen, // wenn nach dem ersten #0 eh schluß ist ^^ // blockweise s := Edit.Text; i := Min(Length(s), Length(Versuch) - 1), Move(s[1], Versuch[Low(Versuch)], i); FillChar(Versuch[Low(Versuch) + i], Length(Versuch) - i, #0); end; |
Re: String zu Array ... of Char
Nur mal so nebenbei:
Müsste das nicht auch so funktionieren?
Delphi-Quellcode:
type
Test = record Daten : string[40]; end; var Eingabe : File of Test; Versuch : Test; //... Versuch.Daten := Edit1.Text; :gruebel: //edit: :oops: Zuviel C# in letzter Zeit... :oops: |
Re: String zu Array ... of Char
Dank der Compilermagic ja wobei die es wohl etwa so machen wird, was bestimmt das Schnellste sein wird ^_^
Delphi-Quellcode:
s := Edit.Text;
i := Min(Length(s), Length(Versuch) - 1), Move(s[1], Versuch[Low(Versuch)], i); S[Low(Versuch) + i] := #0; |
Re: String zu Array ... of Char
Zitat:
Sorry, aber es funktioniert alles nicht ! :wall: |
Re: String zu Array ... of Char
Guten Morgen.
So richtig einfach und verständlich für jedermann ist in Delphi die Zuweisung einer Zeichenkonstante an eine Zeichenvariable:
Delphi-Quellcode:
Fast jede andere Zuweisung strotzt von sogenannten Nebenwirkungen. Vieles funktioniert intuitiv, aber wenn es das einmal nicht tut, dann ist ein Literaturstudium zu den Grundlagen gefragt.
var
c: Char; begin c := #48; end; Wichtig bei einem Problem mit bereitgestelltem Code ist immer, dass du genau beschreibst, was du gemacht hast, was deine Erwartungshaltung dabei war und wie diese enttäuscht wurde - Fehlermeldung, falsches Ergebnis, Explosion, ... Ich gehe davon aus, dass dein Problem künstlich ist und keinen direkten Bezug zu einer reellen Aufgabenstellung hat - sonst ist mit an Sicherheit grenzender Wahrscheinlichkeit ein anderer Lösungsweg der bessere. Hier also ein hoffentlich ausreichend kommentierter Test meines Code-Beispiels von Beitrag #2. Auf meiner Test-Form befinden sich von links nach rechts Edit1, Button1, Button2 und Edit2.
Delphi-Quellcode:
Wichtig ist, dass du jeden Befehl, den du noch nicht kennst in der Online-Hilfe nachschlägst. Auch zu den Operationen, die dir eventuell unverständlich erscheinen mögen, gibt es entprechende Kapitel in der OH. Der gezeigte Code funktioniert bei mir. Wenn er es bei dir nicht tut, dann musst du eventuelle Probleme so beschreiben, dass ich und andere es nachvollziehen können - Geht nicht gibt's nicht.
var
// ein statisches array mit 20 Zeichen // die untere Grenze ist von 0 nach 1 verschoben ca: array [1..20] of Char; // füllt ein char array mit den Zeichen eines Strings procedure FillArray( var a: array of Char; // char array, welches gefüllt werden soll const s: String // string, der die Zeichen liefert ); var i, j: Integer; begin // weil die untere Grenze des char array verschoben sein kann, // und ich den Index für den String s nicht jedesmal mit // einem komplizierten Ausdruck berechnen will, verwende ich // eine zweite Laufvariable j zur Indizierung von s j := 0; // Um die Funktion allgemein zu halten greife ich nicht auf // die mir bekannten array Grenzen zu, sondern verwende die // Funktionen Low() und High() for i := Low(a) to High(a) do begin // Das erste Zeichen in einem String muss über den Index 1 // angesprochen werden Inc(j); // Wenn im String s keine weiteren Zeichen mehr für mein // array enthalten sind, if i > Length(s) // dann fülle ich mit dem speziellen #0 auf then a[i] := #0 // sonst übernehme ich ein weiteres Zeichen else a[i] := s[j]; end; end; procedure TDemoForm.Button1Click(Sender: TObject); begin // Hier sollen die Zeichen aus Edit1 in das global // deklarierte char array ca kopiert werden. // Die eigentliche Arbeit lasse ich durch eine Funktion // erledigen, das Klicken auf den Button ist nur der // Auslöser für diese Aktion FillArray(ca, Edit1.Text); end; procedure TDemoForm.Button2Click(Sender: TObject); begin // Hier werden die Zeichen aus dem char array nach // Edit2 kopiert - geht viel einfacher. Edit2.Text := ca; // Zum Grübeln zeige ich die Länge des resultierenden // Strings an. ShowMessage(IntToStr(Length(Edit2.Text))); end; Freundliche Grüße vom marabu |
Re: String zu Array ... of Char
Zitat:
ich bin auch nicht untätig gewesen .......... learning by doing :gruebel:
Delphi-Quellcode:
Warum Einfach, wenn's kompliziert auch geht ? :wink: for i := 1 to 20 do begin Versuch[i] := Edit1.Text[i]; end; Mein persönliches Problem war, einem "Array of Char" einen String zuzuweisen. :coder2: Ich habe nun nicht hier die Anfrage gestellt und darauf gewartet, dass ich die Antwort auf einem goldenen Tablett seviert bekomme. :warn: Wenn man schon am programmieren ist, dann soll(te) man -auch nit Hilfe- auf die Antwort selber kommen. Meine Anfrage hier und auch die Antwort(en) in diesem Forum waren sehr hilfreich, dafür bedanke ich mich recht herzlich. :party: |
Re: String zu Array ... of Char
Hallo,
und wie wäre es damit?
Delphi-Quellcode:
type
Test = record Daten : array[0..40] of Char; end; var Versuch : Test; ... StrPCopy(Versuch.Daten, Edit1.Text); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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