![]() |
COM - For-Each in Delphi, aber wie?
Hallo zusammen!
Habe da mal eine Frage, und zwar habe ich hier eine VB Quelle...
Delphi-Quellcode:
Soweit konnte ich das übersetzen...
.
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 . . .
Delphi-Quellcode:
Leider funktioniert das ganze aber nicht. For-Each gibt es ja in Delphi nicht.
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; {...} Bekomme immer diese Meldung Zitat:
Das wäre wirklich super von euch! Danke, Peter |
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: ![]() Sherlock |
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 |
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 |
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 |
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:
Allerdings übernehme ich keine Haftung :mrgreen:, einfach mal ausprobieren.
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; {...} |
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: ![]() |
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:
Mit diesem Teil habe ich jedoch ein Problem, da ist irgendwo ein Speicherloch drin, dass ich nicht finde.
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; Läuft das Programm lange genug, ist irgendwann der Speicher voll. Stephan |
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 |
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