AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Records dynamisch verschachteln

Ein Thema von psycore · begonnen am 10. Jun 2008 · letzter Beitrag vom 13. Jun 2008
Antwort Antwort
Seite 2 von 2     12   
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#11

Re: Records dynamisch verschachteln

  Alt 11. Jun 2008, 12:44
Zitat von sirius:
@gammatester:
Es geht darum, dass in varianten Records keine dynamischen Variablen enthalten sein drüfen (also Strings oder dynamische Arrays). Das hat nix mit dem Finalization-Abschnitt einer Unit zu tun, sondern mit dem Ende des Gültigkeitsbereiches einer Variable.
OK, was dazu gelernt. Allerdings ist das Dynamische bei Kommunikation über Records in der Regel doch wohl eher die Ausnahme, bzw. würde über spezielle Prozeduren laufen, die Pointer und Länge verwerten.

(Wenn man in seine Records string durch string[xx] ersetzt, wird's compiliert)

Gruß Gammatester
  Mit Zitat antworten Zitat
psycore

Registriert seit: 16. Sep 2006
Ort: Österreich
11 Beiträge
 
#12

Re: Records dynamisch verschachteln

  Alt 11. Jun 2008, 12:46
Ich versteh aber nicht warum das nicht geht.

Zitat:
Die Teile hinter case teilen sich denselben Speicherbereich. Der Compiler reserviert so viel Platz wie die größte Variante benötigt. Deshalb können auch variante Records in typisierten Dateien verwendet werden.

*edit*

Zitat:
(Wenn man in seine Records string durch string[xx] ersetzt, wird's compiliert)
Heureka!
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#13

Re: Records dynamisch verschachteln

  Alt 11. Jun 2008, 12:52
Zitat von psycore:
Ich versteh aber nicht warum das nicht geht.

Zitat:
Die Teile hinter case teilen sich denselben Speicherbereich. Der Compiler reserviert so viel Platz wie die größte Variante benötigt. Deshalb können auch variante Records in typisierten Dateien verwendet werden.
Wahrscheinlich wegen der Compilermagic und dem Verwischen von Pointern mit arrays/strings. Es wird wahrscheinlich der Pointer in den Record eintragen, aber die eigentliche Länge der Strings/Arrays ist zum Zeitpunkt des Kompilierens nicht bekannt.

Das ist anders, wenn man string[200] o.ä. nimmt, dann werden zB 201 chars reserviert.

Gammtester
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Records dynamisch verschachteln

  Alt 11. Jun 2008, 19:47
Nein, der Punkt ist, dass am Ende jeder Prozedur, die direkt oder indirekt Ansistrings, dynamische Arrays, Variants oder Interfaces verwendet, aufgeräumt werden muss, damit der Referenzzähler stimmt, eben im Gegensatz zu einfachen Typen oder Objektinstanzen. In varianten Records weiß Delphi dann natürlich nicht, ob jetzt ein String oder ein Integer im Record steht, und entsprechend, ob ein Referenzzähler aktualisiert werden muss.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#15

Re: Records dynamisch verschachteln

  Alt 12. Jun 2008, 00:01
Also mir kommt dass so vor, als das in eine Endlose diskusion geht.

Ich würde es auch mit Streams versuchen. Einen Record vieleicht, denn du dan in den Stream schreibst und dan rausliest.
Nickel
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#16

Re: Records dynamisch verschachteln

  Alt 12. Jun 2008, 07:03
Darf man fragen, welchen Weg der Kommunikation zwischen Client und Server du dir gedacht hast?

Bedenke dabei, dass Client und Server in unterschiedlichen Adressbereichen laufen... Ergo wirst du dir bestimmt überlegt habe, wie die Daten vom Client zum Server und anders herum gelangen.
  Mit Zitat antworten Zitat
psycore

Registriert seit: 16. Sep 2006
Ort: Österreich
11 Beiträge
 
#17

Re: Records dynamisch verschachteln

  Alt 12. Jun 2008, 14:52
Client:
Delphi-Quellcode:

procedure TMainForm.ConnectBtnClick(Sender: TObject);
var
  buffer: TIdBytes;
begin
  MsgRec.id := 1;
  MsgRec.auth.version := '0.1';
  MsgRec.auth.nickname := nick_input.text;
  MsgRec.auth.password := pw_input.text;

  try
    Client.Connect;
    buffer := RawToBytes(MsgRec, SizeOf(TMsgRec));
    Client.IOHandler.Write(buffer);
  except
    ShowMessage('Verbindung konnte nicht hergestellt werden');
  end;
end;
Server:
Delphi-Quellcode:



procedure TMainForm.ServerExecute(AContext: TIdContext);
var
  MsgRec: TMsgRec;
  buffer: TIdBytes;
begin
  AContext.Connection.IOHandler.ReadBytes(buffer, SizeOf(TMsgRec));
  BytesToRaw(buffer, MsgRec, SizeOf(TMsgRec));

  case MsgRec.Id of
    1: ClientAuth(MsgRec, AContext);
  end;

end;

procedure TMainForm.ClientAuth(MsgRec: TMsgRec; Client: TIdContext);
var
  i: Integer;
begin
  for i := 0 to concnt do begin //Namenszuweisung für IP!
    if Connections[i].client.Binding.PeerIP = Client.Binding.PeerIP then begin
      Connections[i].name := MsgRec.auth.nickname;
      WriteProtocol('Client #' + IntToStr(concnt) + ': ' + Connections[i].client.Binding.PeerIP + ' changed Name to "' + Connections[i].name + '"');
    end;
  end;
  UpdateClientList;
end;

Klappt auch super :]

Muss jetzt nur noch einen Weg finden die Clients eindeutig zu identifizieren, auch wenn die IP dieselbe ist (das Anhängen der Identifizierungsinformationen an das Data Object scheint nicht zu klappen da der Client bei Indy 10 kein Data Objekt besitzt)
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#18

Re: Records dynamisch verschachteln

  Alt 13. Jun 2008, 08:30
Hmmm ich würde für den Zweck COM+/DCOM verwenden, aber wenns funtioniert, dann hau rein
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr.
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