Announcement

Collapse
No announcement yet.

Record spielt "verrückt"

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Record spielt "verrückt"

    Hallo ihr Tüftler, ich hab ein Problemchen:

    uses MAPI;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    Empfaenger:Array of TMapiRecipDesc;
    i :integer;
    begin
    SetLength(Empfaenger,Memo1.Lines.Count);
    for i:=0 to Memo1.Lines.Count-1 do
    begin
    Empfaenger[i].lpszName:= pChar(Memo1.Lines[i]);
    Empfaenger[i].lpszAddress:= pChar(Memo1.Lines[i]);
    end;
    //zur Kontrolle:
    ListBox1.Clear;
    for i:=0 to Memo1.Lines.Count-1 do
    ListBox1.Items.Add(Empfaenger[i].lpszName+' / '+Empfaengeri].lpszAddress);
    end;

    Wenn in der Memo1 mehrere Zeilen stehen, kommt der "Empfaenger" durcheinander und die Werte stimmen nicht mehr: was mache ich hier falsch?

    Herzlichsten Dank für jede Hilfe.
    Gruß Hans

  • #2
    Hallo,

    >...was mache ich hier falsch?

    Leider einiges - hinter TMapiRecipDesc verbirgt sich ein Record, der in den Feldern lpszName und lpszAddress nur einen <b>Zeiger</b> (LPSTR) auf eine PAnsiChar-Zeichenfolge verwaltet:
    <pre>
    MapiRecipDesc = packed record
    ulReserved: Cardinal; { Reserved for future use }
    ulRecipClass: Cardinal; { Recipient class }
    { MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG }
    lpszName: LPSTR; { Recipient name }
    lpszAddress: LPSTR; { Recipient address (optional) }
    ulEIDSize: Cardinal; { Count in bytes of size of pEntryID }
    lpEntryID: Pointer; { System-specific recipient reference }
    end;
    TMapiRecipDesc = MapiRecipDesc;
    </pre>
    Daher muss das eigene Programm diesen Speicherbereich vorher anfordern, die Zeichen dort ablegen und die <b>Zeigeradresse</b> in der TMapiRecipDesc-Struktur ablegen:
    <pre>
    uses MAPI;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    Empfaenger: Array of TMapiRecipDesc;
    i : Integer;
    pTmp : PAnsiChar;
    begin
    SetLength(Empfaenger,Memo1.Lines.Count);
    for i:=0 to Memo1.Lines.Count-1 do
    begin
    pTmp := AllocMem(Length(Memo1.Lines[i]) + 1); // Puffer wird implizit mit #0 gefüllt
    StrPCopy(pTmp, Memo1.Lines[i]);
    Empfaenger[i].lpszName:= pTmp;
    Empfaenger[i].lpszAddress:= pTmp;
    end;
    //zur Kontrolle:
    ListBox1.Clear;
    for i:=0 to Memo1.Lines.Count-1 do
    ListBox1.Items.Add(Empfaenger[i].lpszName+' / '+Empfaenger[i].lpszAddress);
    // ....
    // allozierten Speicher wieder freigeben..
    // ...
    end;
    </pre>
    Die ganzen Details zu den nullterminierten Strings des Win32-APIs sowie die Unterschiede zu dem Delphi-Strings können in meinem Buch <i>Delphi Win32-Lösungen</i> nachgelesen werden. Dort kümmert sich das ganze Kapitel 3 auf 24 Seiten um dieses Thema

    Comment


    • #3
      Andreas Kosch, herzlichen Dank für die elegante Lösung des Problems.

      MFG Hans Steine

      Comment

      Working...
      X