AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ini-Einstellung umwandeln für Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Ini-Einstellung umwandeln für Komponente

Ein Thema von Helmi · begonnen am 10. Mär 2012 · letzter Beitrag vom 11. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#1

Ini-Einstellung umwandeln für Komponente

  Alt 10. Mär 2012, 23:18
Hallo,

ich steh gerade auf dem Schlauch.

Ich hab eine Ini-Datei in der man Einstellungen für die serielle Schnittstelle machen kann.

Als Komponente nutz ich die VAComm von TMS Software.
Dort wird z. b. Stopbit als Aufzählung (Type) benutzt.

Nun möcht ich aber in der Ini-Datei eine ganz normale Eingabe wie z. B.:
Code:
[RS232]
Parity=EVEN
Stopbit=1
Leider muss ich aber dann die Eingaben "umwandeln", bevor ich die Komponente beschreiben kann.

Momentan mach ich das in einer Function und auf String basierend.
Delphi-Quellcode:
function TMaskForm.COM_Auswahl(Auswahl: TCOM_Auswahl; S: String): Variant;
begin
  //
  S := AnsiLowerCase(S);

  case Auswahl of
    COM_Databit: begin
                    If S = '4then
                      Result := db4;

                    If S = '5then
                      Result := db5;

                    If S = '6then
                      Result := db6;

                    If S = '7then
                      Result := db7;

                    If S = '8then
                      Result := db8;
                  end;
    COM_Stopbit: begin
                    If S = '1then
                      Result := sb1;

                    If S = '1.5then
                      Result := sb15;

                    If S = '2then
                      Result := sb2;
                  end;
    COM_Parity: begin
                    If S = 'nonethen
                      Result := paNone;

                    If S = 'eventhen
                      Result := paEven;

                    If S = 'markthen
                      Result := paMark;

                    If S = 'oddthen
                      Result := paOdd;

                    If S = 'spacethen
                      Result := paSpace;
                  end;
  end;
end;
Nur gefällt mir das nicht wirklich!

Gibt es denn vielleicht eine andere Möglichkeit?

Was mir noch einfallen würde, das wäre die Auswahl als Index auszulesen um dann mit einem Cast auf die Auswahl die Komponente zu beschreiben.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Ini-Einstellung umwandeln für Komponente

  Alt 10. Mär 2012, 23:25
Delphi-Quellcode:
const
  cDataBit : array [TDataBit?] of string = ( '4', '6', ...);
so definieren und dann die Array Werte vergleichen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 00:21
Über die RTTI kannst du diese ENUMs auch direkt in Strings umwandeln und zurück.

Oder du nimmst einfache Casts ala Ord, und konvertierst die ENUMs in Integer.
$2B or not $2B
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 08:32
Converterklassen bauen.

Delphi-Quellcode:
uses StrUtils;

Type
  TParityConverter = Class
  Private
    Class Const
      ParitySettings = Array [paEven..paSpace] Of String = ('even','mark','odd','space');
  Public
    Class Function FromString (setting : String) : TParity;
    Class Function ToString (setting : TParity) : String;
  End;

Class Function TParityConverter.FromString (setting : String) : TParity;
Var
  p : Integer;

Begin
  p := IndexText (setting, ParitySettings);
  if p=-1 then
    Raise EConvertException.CreateFmt('Unknown parity setting %s', [setting])
  else
    result := TParity(p);
End;

Class Function TParityConverter.ToString (setting : TParity) : String;
Begin
  Try
    Result := ParritySettings[Ord(setting)];
  Except
    Raise EConvertException.CreateFmt('Invalid parity (%d)',[setting]);
  End
End;
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 08:45
wobei Sir Rufo's Ansatz mir hier am schlanksten erscheint ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 11:46
Über die RTTI kannst du diese ENUMs auch direkt in Strings umwandeln und zurück.
Oder du nimmst einfache Casts ala Ord, und konvertierst die ENUMs in Integer.
So habe ich das gemacht. Das ist nicht der schnellste Weg und etwas aufwendig umzusetzen, aber es ist dann dafür universell einsetzbar für alle Propertys.
Falls jemand mal nachschauen möchte:

Delphi-Quellcode:
procedure TodProp.LoadPropValue(const od: Tod; PropName, PropValue: String);
var
  Context: TRttiContext;
  RttiType: TRttiType;
  PropInfo: TRttiProperty;
  F: Boolean;
  Attr: TCustomAttribute;
  Value: TValue;
  InstOd: TInstOd;
  _od, iod: Tod;
  _PropName: String;
  V: Integer;
begin
  if (not Assigned(od)) or (PropName = '') then
    Exit;

  _od := od;
  _PropName := PropName;
  CorrectSubOd(_od, _PropName);
  if not Assigned(_od) then
    Exit;

  Context := TRttiContext.Create;
  RttiType := Context.GetType(_od.ClassType);

  if Assigned(RttiType) then
    begin
      for PropInfo in RttiType.GetProperties do
        begin
          if PropInfo.Name <> _PropName then
            Continue;
          F := False;
          for Attr in PropInfo.GetAttributes do
            begin
              if Attr is AttrOd then
                F := True;
            end;
          if F then
            begin
              Value := TValue.Empty;
              case PropInfo.PropertyType.TypeKind of
                tkUnknown:
                  ;
                tkInteger:
                  Value := TValue.From(StrToIntDef(PropValue, 0));
                tkChar:
                  ;
                tkEnumeration: // <<<<<================================= HIER
                  if TryStrToInt(PropValue, V) then
                    Value := TValue.FromOrdinal(PropInfo.PropertyType.Handle, V)
                  else
                    Value := TValue.FromOrdinal(PropInfo.PropertyType.Handle, GetEnumValue(PropInfo.PropertyType.Handle, PropValue));
                tkFloat:
                  if PropInfo.GetValue(_od).IsType<TDateTime> then
                    Value := TValue.From(StrToDateTimeDef(PropValue, 0))
                  else if PropInfo.GetValue(_od).IsType<TTime> then
                    Value := TValue.From(StrToTimeDef(PropValue, 0))
                  else
                    Value := TValue.From(StrToFloatDef(PropValue, 0));
                tkString:
                  Value := TValue.From(PropValue);
                tkSet:
                  ;
                tkClass:
                  begin
                    iod := FoundOd(PatternToId(PropValue));
                    if (Assigned(iod)) or (AssignInstOdFlag) then
                      begin
                        Value := iod;
                      end
                    else
                      begin
                        InstOd := TInstOd.Create;
                        InstOd.od := _od;
                        InstOd.PropName := _PropName;
                        InstOd.Id := PropValue;
                        InstOdList.Add(InstOd);
                      end;
                  end;
                tkMethod:
                  ;
                tkWChar:
                  ;
                tkLString:
                  ;
                tkWString:
                  ;
                tkVariant:
                  ;
                tkArray:
                  ;
                tkRecord:
                  ;
                tkInterface:
                  ;
                tkInt64:
                  ;
                tkDynArray:
                  ;
                tkUString:
                  Value := TValue.From(PropValue);
                tkClassRef:
                  ;
                tkPointer:
                  ;
                tkProcedure:
                  ;
              end;
              if not Value.IsEmpty then
                PropInfo.SetValue(_od, Value);
            end;
        end;
    end;

  Context.Free;
end;

function TodProp.GetPropValue(const od: Tod; PropName: String): String;
var
  PropValue: String;
  Context: TRttiContext;
  RttiType: TRttiType;
  PropInfo: TRttiProperty;
  F: Boolean;
  Attr: TCustomAttribute;
  Value: TValue;
  O: TObject;
  _od: Tod;
  _PropName: String;
begin
  Result := '';

  if (not Assigned(od)) or (PropName = '') then
    Exit;

  if Lowercase(PropName) = Lowercase('odId') then
    Exit(od.odId);

  _od := od;
  _PropName := PropName;
  CorrectSubOd(_od, _PropName);
  if not Assigned(_od) then
    Exit;

  Context := TRttiContext.Create;
  RttiType := Context.GetType(_od.ClassType);

  if Assigned(RttiType) then
    begin
      for PropInfo in RttiType.GetProperties do
        begin
          if PropInfo.Name <> _PropName then
            Continue;
          F := False;
          for Attr in PropInfo.GetAttributes do
            begin
              if Attr is AttrOd then
                F := True;
            end;
          if F then
            begin
              PropValue := '';
              Value := PropInfo.GetValue(_od);
              case Value.Kind of
                tkUnknown:
                  ;
                tkInteger:
                  if Value.AsInteger = 0 then
                    PropValue := ''
                  else
                    PropValue := inttostr(Value.AsInteger);
                tkChar:
                  ;
                tkEnumeration: // <<<<<================================= HIER
                  if Value.AsOrdinal = 0 then
                    PropValue := ''
                  else
                    PropValue := GetEnumName(Value.TypeInfo, Value.AsOrdinal);
                tkFloat:
                  if Value.AsExtended = 0 then
                    PropValue := ''
                  else if Value.IsType<TDateTime> then
                    PropValue := DateTimeToStr(Value.AsExtended)
                  else if Value.IsType<TTime> then
                    PropValue := TimeToStr(Value.AsExtended)
                  else
                    PropValue := FloatToStr(Value.AsExtended);
                tkString:
                  PropValue := Value.AsString;
                tkSet:
                  ;
                tkClass:
                  begin
                    O := Value.AsObject;
                    try
                      if (O <> nil) and (O is Tod) then
                        PropValue := (O as Tod).odId;
                    except
                      PropValue := '';
                    end;
                  end;
                tkMethod:
                  ;
                tkWChar:
                  ;
                tkLString:
                  ;
                tkWString:
                  ;
                tkVariant:
                  ;
                tkArray:
                  ;
                tkRecord:
                  ;
                tkInterface:
                  ;
                tkInt64:
                  ;
                tkDynArray:
                  ;
                tkUString:
                  PropValue := Value.AsString;
                tkClassRef:
                  ;
                tkPointer:
                  ;
                tkProcedure:
                  ;
              end;
              if PropValue <> 'then
                Result := PropValue;
            end;
        end;
    end;

  Context.Free;
end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 11:58
ist ja nicht gerade DRY

Leg dir doch eine interne Procedure an, die lesen und schreiben kann mit einem zusätzlichen Parameter (lesend/schreibend). Mit deinen vorhandenen procedures rufst du dann nur noch diese interne auf und schon ist es DRY und KISS
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 12:54
Delphi-Quellcode:
const
  cDataBit : array [TDataBit?] of string = ( '4', '6', ...);
Ich steh irgenwie auf dem Schlauch.

Die Idee mit dem Array ist gut.

Ich habs folgendermaßen gemacht:
cDataBit: array [0..4] of string = ('4', '5', '6', '7', '8'); und frag dann so ab:
Delphi-Quellcode:
for i := low(cDataBit) to high(cDataBit) do
  If cDataBit[i] = S then
    begin
      Result := TVaDatabits(i);
      break;
    end;
Ich wollt eigentlich Sir Rufo´s Idee übernehmen und den Typ ins Array übernehmen, also so:
cDataBit: array [TVaDataBits] of string = ('4', '5', '6', '7', '8'); .


Nur dann erhalte ich bei der for-Schleife:
for i := low(cDataBit) to high(cDataBit) do .
folgende Fehlermeldung:
Zitat:
[DCC Fehler] Main.pas(444): E2010 Inkompatible Typen: 'Integer' und 'TVaDatabits'
TVaDataBits ist so deklariert: TVaDatabits = (db4, db5, db6, db7, db8);
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 13:25
@Helmi

der Zugriff bei Sir Rufos's Variante ist viel einfacher
Delphi-Quellcode:
Const
c:Array[TPrintScale] of String=('None', 'Proportional', 'PrintToFit') ;
procedure TForm1.Button1Click(Sender: TObject);
begin
    Caption := c[poPrintToFit];
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Ini-Einstellung umwandeln für Komponente

  Alt 11. Mär 2012, 13:46
@Helmi

der Zugriff bei Sir Rufos's Variante ist viel einfacher
Delphi-Quellcode:
Const
c:Array[TPrintScale] of String=('None', 'Proportional', 'PrintToFit') ;
procedure TForm1.Button1Click(Sender: TObject);
begin
    Caption := c[poPrintToFit];
end;
Ich glaube da gibt´s ein Missverständnis.

Ich habe einen String, den ich als Auswahl nutzen möchte, nicht anders rum.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:51 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