Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi is Operator macht kommische Dinge (https://www.delphipraxis.net/92209-operator-macht-kommische-dinge.html)

QuickAndDirty 16. Mai 2007 08:23


is Operator macht kommische Dinge
 
Hallo,
der Is Opperator macht bei mir in einer Procedur seltsame Dinge .
Er meldet Value is TStrings = true obwohl ich ein TMemoField übergebe.

Die aufrufende Prozedur der aufrufenden Prozedur der Prozedur mit dem Problem. :)
Delphi-Quellcode:
procedure TSD_Ressourcengruppen.RecalcList;
var
  OldC: TCursor;
begin
  OldC := Screen.Cursor;
  Screen.Cursor := crHourglass;
  try
    with T_RGIT do
    begin
      First;
      while not EOF do
      begin
        Delete;
        Refresh;
        First;
      end;
    end;

    with CalcQuery do
    begin
      Close;
      SQL.Assign(T_Data.FieldByName('SQL_')); /// <<<<<<<<<<< Das ist der Aufruf
      if SQL.Count = 0 then
      begin
        raise Exception.Create({$IFDEF TRANSLATION}TransLateString{$ENDIF}('Die Liste konnte nicht berechnet werden, da keine Auswahl vorhanden ist'));
      end;
      Open;
      First;
      while not EOF do
      begin
        with T_RGIT do
        begin
          Append;
          FieldByName('RGrp_ID').AsInteger := T_DataID.Value;
          FieldByName('RTyp_ID').AsInteger := 1;
          FieldByName('RID').AsInteger := CalcQuery.FieldByName('ID').AsInteger;
          Post;
        end;
        Next;
      end;
    end;
  finally
    Screen.Cursor := OldC;
  end;
end;
Die aufrufende Prozedur der Prozedur mit dem Problem
Delphi-Quellcode:
Procedure TVTableStringlist.Assign(Source:TPersistent);
Begin
  if assigned(Owner.MyDataset) and not DBProvide.SetSQL(owner.MyDataSet,TStrings(Source),owner.DataSetType,owner.DatabaseType) then
    Raise ECouldNotSetProperty.Create('TVTabelStringlist.Assign konnte nicht ausgeführt werden.');
end;
Hier der betroffene Code.
Delphi-Quellcode:
Function SetSQL(aDataSet:TDataset;Value:TStrings;DataSetType:TDataSetType; db: TDBType=dtDEFAULT):Boolean;
var ERRRec:TSerializedDBEngineError;
   astrings:TStringlist;
Begin
  astrings := tstringlist.create;
  try
    if Value is TStrings then // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<HIER PASSIERT DIE GESCHICHTE
      aStrings.AddStrings(Value)
    else
      aStrings.Assign(Value);

    ERRREC.Occured := false;
    result := false;
    if db = dtDefault then
      db := DefaultDB;
    case db of
      dtDefault: showmessage('DefaultDB darf nicht dtDEFAULT sein.');
      dtBDE: Case Datasettype of
               dstQuery: Result := SetSQLBDE_QRY(ERRREC,aDataset,aStrings);
             end;
      dtDBI: ;//DBISAM not ready
      dtDBX: ;//DBX
    end;
  finally
    astrings.Free;
    astrings := nil;
  end;
  DBrsError(ERRREC);
end;

Bernhard Geyer 16. Mai 2007 08:28

Re: is Operator macht kommische Dinge
 
Das Problem ist nicht die is-Abfrage (Value ist ja vom Typ TStrings definiert), sondern der knallharte Cast in TVTableStringlist.Assign (TStrings(Source)).
Mit einem harten Cast kannst du problemlos ein Apfel als Auto definieren. Erst wenn du Versuchst einzusteigen wirst du Probleme bekommen.

QuickAndDirty 16. Mai 2007 08:31

Re: is Operator macht kommische Dinge
 
HM,
ist das hier besser?
Delphi-Quellcode:
Procedure TVTableStringlist.Assign(Source:TPersistent);
Begin
  if assigned(Owner.MyDataset) and not DBProvide.SetSQL(owner.MyDataSet,Source as TStrings, owner.DataSetType,owner.DatabaseType) then
    Raise ECouldNotSetProperty.Create('TVTabelStringlist.Assign konnte nicht ausgeführt werden.');
end;

Bernhard Geyer 16. Mai 2007 08:40

Re: is Operator macht kommische Dinge
 
Ja.

Aber vergiss nicht das die Anweisung "Source as TStrings" eine Exception auslößt wenn Source nicht vom Typ (oder Subtyp) TStrings ist.

Muetze1 16. Mai 2007 08:41

Re: is Operator macht kommische Dinge
 
Ja, weil AS intern eine IS Prüfung macht, würde dir dort bei einem Typ der nicht TStrings unter seinen Vorfahren hat eine Exception um die Ohren geschmissen...

QuickAndDirty 16. Mai 2007 08:45

Re: is Operator macht kommische Dinge
 
Ja habs gerade festgestellt Exception.....also keine Lösung.
Ich werde wohl der Procedure SetSQL einen Kopf mit nem TPersistent Parameter bauen,
Das wäre ja ich nach den Regeln der OOP das Vernünftigste.

Danke, für euere schnelle Hilfe trotz der dummen Frage.


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