![]() |
Problem beim Kopieren von dyn. Arrays
Ich habe hier nun ein Problem wo ich echt nicht weiterkomme.
Ich habe folgende Situation: -Unit des Hauptformulars hat folgendes im Interface-Teil deklariert
Delphi-Quellcode:
Soweit sogut. Ein dynamisches Array, in welches dann weiter in der Unit Daten auch eingelesen werden. Das funktioniert auch.
type
TZeitserver = record IP: String; LastPing: String; LastCheck: String; end; var Zeitserver: array of TZeitserver; Nun habe ich eine zweite Unit in welcher ich eine Kopie des Arrays aus der ersten Unit benötige. Erstes Problem: -Wie kriege ich die Typendefinition aus Unit1 in Unit2? Meine Lösung: -Einfach das gleiche nochmal in den Interface-Teil aus der ersten in die Zweite Unit kopieren (type TZeitserver = record etc...) Das Problem -Er meldet incompatible types. Kopiert wird das ganze mit
Delphi-Quellcode:
Wie geht das?
TempZeitserver := Copy(frmMain.Zeitserver, 0, Length(frmMain.Zeitserver));
|
Re: Problem beim Kopieren von dyn. Arrays
Also einbinden kannst du die unit1, indem du einfach in unit2 diese in die uses-Liste schreibst (im Implementation-Teil).
Delphi-Quellcode:
Zum kopieren von diesem Array kann ich nix sagen, da ich das selber noch nie gemacht habe.
implementation
uses unit1; {$R *.dfm} Flare |
Re: Problem beim Kopieren von dyn. Arrays
Zitat:
Dust Signs |
Re: Problem beim Kopieren von dyn. Arrays
Ich weiß jetzt nicht, ob es extra einen Befehlt dafür gibt, aber ansonsten mach es doch ganz einfach mit einer Schleife ;-)
Du ermittelst die Länge des 1. Arrays und setzt diese für den 2. Array. Über eine Schleife setzt du dann die Werte des 1. Arrays für den 2. Array.
Delphi-Quellcode:
SetLength(Array2,Length(Array1));
for i:=0 to Length(Array2)-1 do begin Array2[i].IP := Array1[i].IP; Array2[i].LastPing := Array1[i].LastPing; {...} end; |
Re: Problem beim Kopieren von dyn. Arrays
Hallo Stefan,
die vom Compiler gelieferte Fehlermeldung ist verständlich, da du durch das Kopieren der Typdefinition einen neuen Typen erzeugst. Obwohl beide Typen den gleichen Aufbau besitzen, sieht der Compiler sie als unterschiedlich an. Gib deinem dynamischen Array einen Namen und lagere die Typdefinition in eine weitere Unit aus, die du dann in deinen beiden Units in die USES-Anweisung aufnimmst:
Delphi-Quellcode:
Das Kopieren von Arrays kannst du - wie von Dust Signs beschrieben - mit dem Copy-Befehl durchführen. Start und Länge mußt du dabei nicht angeben:
unit Typen;
interface type TZeitserver = record IP: String; LastPing: String; LastCheck: String; end; TDynZeitserverArray = array of TZeitserver; implementation end.
Delphi-Quellcode:
Eine einfache Zuweisung der Zeiger würde lediglich den Referenzzähler des Original-Arrays erhöhen. Danach wäre jede Änderung, die du mit einem der beiden Arrrays durchführst, auch im jeweils anderen sichtbar.
var
Original, Kopie : TDynZeitserverArray; begin Kopie := Copy(Original); end; Gruß Hawkeye |
Re: Problem beim Kopieren von dyn. Arrays
Achso alles klar, werde ich mal ausprobieren. Die Länge und den Index beim Copy Befehl hatte ich eingegeben da ich durch die Suche einen ähnlichen Beitrag gefunden hatte in dem gesagt wurde dass Länge und Index angegeben werden müssten
|
Re: Problem beim Kopieren von dyn. Arrays
Zitat:
|
Re: Problem beim Kopieren von dyn. Arrays
@himitsu
Hast du es schon einmal ausprobiert? Zitat:
|
Re: Problem beim Kopieren von dyn. Arrays
Strings (AnsiStrings) sind auch "nur" dynamische Arrays und im Gegensatz zu dem, was laut dem in der OH stehen soll, werden Strings auch kopiert, wenn man sie ändert, obwohl sie intern ebenfalls dynamische Arrays sind.
Und laut der offiziellen Definition dieser dynamsichen Typen mit Refferenzzählung sollte es jedenfalls so sein (wie ich geschrieben hab)? Nein, getestet hatte ich es noch nicht, aber ich konnte bisher auch noch keinen Fehler entdecken, welcher darauf zu führen war, daß nicht kopiert wurde ... obwohl ich schon ein paar dynamische Arrays verwendet hab. :gruebel: wie gesadt, Strings sind intern eigentlich genauso wie dynamische Arrays definiert (abgesehn, daß sie bei 1 beginnen und noch ein "unsichtbares", zusätzliches Feld mit dem Wert #0 am Ende haben) und dort funktioniert es doch aus o.O
Delphi-Quellcode:
Also wenn das Fettgedruckte stimmt, dann würde ich das als einen GROOOOOßEN, absichtlichen Delphi-Bug ansehen :evil:
var A, B: String;
begin SetLength(A, 1); A[1] := '1'; B := A; B[1] := '2'; // A[1] ist immernoch '1' end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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