Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi COM - For-Each in Delphi, aber wie? (https://www.delphipraxis.net/116272-com-each-delphi-aber-wie.html)

DelphiPeter 26. Jun 2008 06:49


COM - For-Each in Delphi, aber wie?
 
Hallo zusammen!

Habe da mal eine Frage, und zwar habe ich hier eine VB Quelle...

Delphi-Quellcode:
.
Dim oRecipients As DvApi32.Addresses
Dim oRecipient As DvApi32.Address
.
.
.
 If Not oItem.Recipients.Count = 0 Then
    Set oRecipients = oItem.Recipients
    For Each oRecipient In oRecipients
      strTo = strTo & "To: " & oRecipient.EMail & ";" & CrLf
    Next
  End If
.
.
.
Soweit konnte ich das übersetzen...
Delphi-Quellcode:
var
  oRecipients: Addresses;
  oRecipient: Address;
begin
  {...}
  if oMailItem.Recipients.Count > 0 then begin
     oRecipients := oMailItem.Recipients;
     // Ab hier hänge ich
     for oRecipient in oRecipients do
     begin
         // irgendwas tun
         Next;
     end;  
  end;
  {...}
Leider funktioniert das ganze aber nicht. For-Each gibt es ja in Delphi nicht.

Bekomme immer diese Meldung

Zitat:

[DCC Fehler] MyUnit.pas(487): E2431 for-in-Anweisung arbeitet nicht mit Kollektionstyp 'Addresses', weil 'Addresses' kein Element für 'GetEnumerator' enthält oder darauf nicht zugegirffen werden kann
[DCC Fehler] MyUnit.pas(490): E2003 Undefinierter Bezeichner: 'Next'
Kann mir da mal jemand helfen?
Das wäre wirklich super von euch!


Danke,

Peter

Sherlock 26. Jun 2008 07:02

Re: COM - For-Each in Delphi, aber wie?
 
Also ich kann zunächst nur zweierlei sagen:
1. Delphi 2007 hat sehr wohl eine for each Implementierung (nennt sich: for in), und die nutzt Du ja auch ;)
2. next gibt es in Delphi nicht, dafür gibt es begin...end, kannst Du also ersatzlos streichen.

Naja, und dann scheint der Typ Adresses nicht hinreichend bekannt zu sein, um ein for in zu unterstützen. Mit ein paar Klimmzügen schaffst Du es aber vielleicht trotzdem, nachdem Du hier reingeschaut hast: http://delphi.about.com/cs/adptips20...ltip0404_3.htm

Sherlock

DelphiPeter 26. Jun 2008 07:41

Re: COM - For-Each in Delphi, aber wie?
 
Hallo Sherlock,

danke für den Hinweis, ich weiß leider nicht wie ich GetEnumerator anwenden soll um Addresses bekannt zu machen. Da fehlt mir scheinbar noch ein wenig Erfahrung.

Kannst du mir nochmal bitte helfen?

Vielen vielen Dank!

Peter

Sherlock 26. Jun 2008 10:04

Re: COM - For-Each in Delphi, aber wie?
 
Da kann ich leider nicht weiter helfen. Versuch halt herauszubekommen, wie Adresses definiert ist. Eventuell gibts eine Items-Liste, oder sowas?

Sherlock

DelphiPeter 1. Aug 2008 09:24

Re: COM - For-Each in Delphi, aber wie?
 
Hallo Zusammen!

Wie sieht es denn aus, kann mich jemand aus meiner Misere holen? Komme einfach nicht weiter :-(



Peter

DeddyH 1. Aug 2008 09:32

Re: COM - For-Each in Delphi, aber wie?
 
Es scheint sich ja um ein Array oder eine TList o.ä. zu handeln. Könnte man nicht einfach mit einer "ganz normalen" For-Schleife durchgehen?
Delphi-Quellcode:
var
  oRecipients: Addresses;
  oRecipient: Address;
  i: integer;
begin
  {...}
  if oMailItem.Recipients.Count > 0 then begin
     oRecipients := oMailItem.Recipients;    
     for i := 0 to Pred(oRecipients.Count) do
     begin
       oRecipient := oRecipients[i] as Address;
       //irgendwas machen
     end;  
  end;
  {...}
Allerdings übernehme ich keine Haftung :mrgreen:, einfach mal ausprobieren.

Phoenix 1. Aug 2008 09:36

Re: COM - For-Each in Delphi, aber wie?
 
Och menno. Du magst nicht wirklich hier nach Com und Enumerator suchen, oder?

Unser Sakura hat irgendwo hier unter diesen Stichworten in der DP einen Link versteckt, wo er auf seine ComEnumerator Unit verweist.

Einen kurzen Artikel darüber (mit Link zu CodeCentral wo's die Unit gibt) findest Du hier:
http://www.delphi3000.com/articles/article_4209.asp?SK=

nahpets 1. Aug 2008 09:37

Re: COM - For-Each in Delphi, aber wie?
 
Hallo,

ich ahne, was Dein Problem ist, weiß aber keine Lösung.

Eventuell hilft Dir der Auszug aus einem Quelltext von einem meiner Programme:
Delphi-Quellcode:
      wmiObjectSet := wmiServices.InstancesOf(sClass, wbemFlagReturnImmediately or wbemQueryFlagShallow, nil);
      Enum := (wmiObjectSet._NewEnum) as IEnumVariant;
      bOk := False;
      while (Enum.Next(1, ovVar, lwValue) = S_OK) do begin
        bOk      := True;
        wmiObject := IUnknown(ovVar) as SWBemObject;
        propSet  := wmiObject.Properties_;
        propEnum := (propSet._NewEnum) as IEnumVariant;

        while (propEnum.Next(1, ovVar, lwValue) = S_OK) do begin
          wmiProp := IUnknown(ovVar) as SWBemProperty;
          sValue := '';
          if VarIsNull(wmiProp.Get_Value) then sValue := 'Is Null' else
          case wmiProp.CIMType of
            wbemCimtypeSint8,
            wbemCimtypeUint8,
            wbemCimtypeSint16,
            wbemCimtypeUint16,
            wbemCimtypeSint32,
            wbemCimtypeUint32,
            wbemCimtypeSint64:
              if VarIsArray(wmiProp.Get_Value) then begin
                if VarArrayHighBound(wmiProp.Get_Value, 1) > 0 then begin
                  for Count := 1 to VarArrayHighBound(wmiProp.Get_Value, 1) do begin
                    sValue := sValue + ' ' + IntToStr(wmiProp.Get_Value[Count]);
                  end;
                end;
              end else sValue := IntToStr(wmiProp.Get_Value);

            wbemCimtypeReal32,
            wbemCimtypeReal64: sValue := FloatToStr(wmiProp.Get_Value);

            wbemCimtypeBoolean: if wmiProp.Get_Value then sValue := 'True' else sValue := 'False';

            wbemCimtypeString,
            wbemCimtypeUint64:
              if VarIsArray(wmiProp.Get_Value) then begin
                if VarArrayHighBound(wmiProp.Get_Value, 1) > 0 then begin
                  for Count := 1 to VarArrayHighBound(wmiProp.Get_Value, 1) do begin
                    sValue := sValue + ' ' + wmiProp.Get_Value[Count];
                  end;
                end;
              end else begin
                sValue := wmiProp.Get_Value;
              end;
            wbemCimtypeDatetime:
              sValue := wmiProp.Get_Value;
          else
            begin
              Try
                sValue := wmiProp.Get_Value;
              Except
                on e : Exception Do Begin
                  sValue := 'Wert kann nicht gelesen werden: ' + e.Message;
                end;
              End;
            end;
          end;
          sl.Add(wmiProp.Name + '=' + sValue);
        End;
Mit diesem Teil habe ich jedoch ein Problem, da ist irgendwo ein Speicherloch drin, dass ich nicht finde.
Läuft das Programm lange genug, ist irgendwann der Speicher voll.

Stephan

DelphiPeter 13. Aug 2008 07:09

Re: COM - For-Each in Delphi, aber wie?
 
Hallo Leute!

Letztlich hat der Vorschlag von DeddyH geholfen.
ich möchte mich bei allen für die tolle Hilfe bedanken.


DANKE

Peter

DeddyH 13. Aug 2008 07:15

Re: COM - For-Each in Delphi, aber wie?
 
Das hätte ich nun gerade nicht erwartet :lol:. Aber wenn es funktioniert, umso besser.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 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