![]() |
Re: Set Of ?
Moin Jan,
Zitat:
Dazu brauchst Du die Toolsapi (Standardmässig nicht im Suchpfad von Delphi enthalten). Ich hatte auch mal ein Beispiel dazu. Da muss ich aber erst einmal suchen, wo ich das hab' [EDIT] @Hansa: Zitat:
[/EDIT] |
Re: Set Of ?
Zitat:
Zitat:
Gruß Jan |
Re: Set Of ?
Moin Jan,
ich hab's gefunden: Guckst Du hier: ![]() Mit Toolsapi lag' ich weit daneben. Die Unit heisst typinfo. Es geht um die Verarbeitung der Run-Time TypeInformation (RTTI) |
Re: Set Of ?
Hallo Christian,
vielen Dank für deine Antwort, aber du hast leider entweder meinen Post oder den Artikel nicht richtig gelesen. Zitat:
Gruß Jan |
Re: Set Of ?
Moin Jan,
ja und? ;-) Dann speichere Dir die ausgelesenen Strings in einer TStringList. Anschliessend kannst Du dann mit IndexOf den Wert ermitteln. Die Liste darf nur nicht sortiert sein. Da in Delphi die Werte für die Aufzählungstypen bei 0 beginnen und Lückenlos aufeinander folgen, korrespondiert also der Index genau mit dem Wert. Soll die Liste sortiert sein, kannst Du auch den Wert als Objekt zumsammen mit dem String speichern. |
Re: Set Of ?
Langsam glaube ich, es wird immer viel zu kompliziert gedacht, wobei ich mich mit einschließe.
Zitat:
Zitat:
Du willst also nur wissen ob der Sring 'Comment' in Deinem Set ist, richtig ? Und dazu wolltest Du einfach :
Delphi-Quellcode:
benutzen. Wie wäre es denn, wenn Du einfach alle diese Teilstrings statt in das Set zu packen, aneinanderreihst ?
if MeinString IN MeinSet
statt so:
Delphi-Quellcode:
einfach ungefähr so :
var nameset : set of (comment, name, id);
Delphi-Quellcode:
Dann bist Du doch schon fertig. Dann kriegst Du mit :
const namestring : 'comment name id';
Delphi-Quellcode:
raus, ob das Ding da drin ist oder nicht :!: Vermute mal, das ist für drei Strings einfach nicht kompliziert genug, um es so zu machen. :mrgreen:
if pos (SuchString,namestring) <> 0;
|
Re: Set Of ?
:shock: Wo er recht hat...
Ein wahrlich praktisch denkendes Köpfchen der gute Hansa! @Christian, du magst vielleicht auch recht haben aber deine Version ist wohl bei weitem aufwändiger. Ich danke Dir allerdings trotzdem für deine aufschlussreichen comments, den Link fand ich sehr interressant. Gruß Jan |
Re: Set Of ?
Zitat:
|
Re: Set Of ?
Es geht auch eleganter, wenn wir den Compiler zu Hilfe nehmen. Zu jedem deklarierten Typ werden durch den Compiler auch Typ Informationen in die EXE eingelinkt. Durch diese wird es möglich dynamisch zur Laufzeit Typen zu überprüfen oder sogar zu casten. Die Funktionen in Unit TypInfo.pas sind da sehr hilfreich. Nachfolgender Code "castet" eine beliebigen String in ein Mengenelement aus der Menge von TName.
Delphi-Quellcode:
Da auch Strings an StrToName() übergeben werden können die nicht in TName vorkommen habe ich das Element "unknown" deklariert. Alle Strings die nicht in TName vorkommen werden als unknown definiert.
uses TypInfo;
type // der Namen Typ + das set TName = (unknown, idiot, comment, name, id); TNames = set of TName; function StrToName(const Value: String): TName; // wandelt einen String in ein TName um var I: Integer; begin I := GetEnumValue(TypeInfo(TName), Value); if I = -1 then Result := unknown else Result := TName(I) end; function NameToStr(Value: TName): String; // gibt den lesbaren Bezeichner eines Mengen Elemente zurück begin Result := GetEnumName(TypeInfo(TName), Integer(Value)); end; procedure Test; var Name: TName; begin Name := StrToName('comment'); Writeln( NameToStr( Name ) ); WriteLn( NameToStr( StrToName('ID') ) ); WriteLn( NameToStr( StrToName('iD') ) ); WriteLn( NameToStr( StrToName('Comment') ) ); WriteLn( NameToStr( StrToName('Test') ) ); if StrToName('id') in [id, comment] then WriteLn('id is in [id, comment]') else WriteLn('id is not in [id, comment]'); if StrToName('Test') in [id, comment] then WriteLn('Test is in [id, comment]') else WriteLn('Test is not in [id, comment]') end; Interessant wird es jetzt mit "idiot" denn mit Hansas Vorschlag würde eine solche Doppeldeutigkeit zu Fehlern führen. Da eben "id" auch in "idiot" vorkommt. Gruß Hagen |
Re: Set Of ?
Grüß Dich Hagen,
Delphi-Quellcode:
Das ist doch fast genau was ich von Anfang an haben wollte!
function StrToName(const Value: String): TName;
// wandelt einen String in ein TName um var I: Integer; begin I := GetEnumValue(TypeInfo(TName), Value); if I = -1 then Result := unknown else Result := TName(I) end; Es wandelt zwar nicht jeden beliebigen String in einen TName mit selbigem Wert um, aber immerhin tut es das was ich brauche. Kann mir denn mal jemand sagen warum es die function strtoname, mit der man jeden beliebigen String umwandeln kann, nicht von vornherein bei Delphi gibt? Danke Dir! Gruß Jan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 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 by Thomas Breitkreuz