Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fehler: Falscher Variablentyp (https://www.delphipraxis.net/164572-fehler-falscher-variablentyp.html)

ByTheTime 18. Nov 2011 22:01

Fehler: Falscher Variablentyp
 
Hallo Dephianer,
arbeite an einem Programm, der Click auf einen bestimmten Button öffnet es Excel. Doch in den letzen 2 Tagen habe ich diese Funktion nicht gebraucht und an anderen Funktionen gearbeitet. Dabei muss ich wohl mal einen Fehler gemacht haben:
Wenn ich den Button jetzt Clicke, bekomme ich folgende Fehlermeldung: "Falscher Variablentyp." Ich nehme das mal wörtlich... Ich muss wohl meine globale Variable 'Excel' falsch deklariert haben. Aber es stimmt alles, sie ist vom Typ 'Variant'. Was könnte mein Problem sein?


Danke,

Lukas

Bummi 18. Nov 2011 22:09

AW: Fehler: Falscher Variablentyp
 
:glaskugel: ich sehe ein Problem ... zu wenig Informationen

ByTheTime 18. Nov 2011 23:08

AW: Fehler: Falscher Variablentyp
 
Also ich weiß ehrlich gesagt nicht was es dazu noch zu sagen gibt :? Okay, das kann ich noch zusammenkratzen:

Delphi-Quellcode:
var //global
 Excel: Variant;

procedure TFormTPWrite.ArrayToExcel;
begin
 try
   Excel := CreateOleObject('Excel.Application');
  except
   ShowMessage('Excel konnte nicht gestartet werden!');
   Exit;
 end;

 Excel.DisplayAlerts := false;
 Excel.Workbooks.Open(AppDataPath + 'Vorlage');

//Code

 Excel.ActiveWorkbook.SaveAs(Path + 'Datei ' + EdKalender.Text + ' - ' + EdUsername.Text);
 Excel.DisplayAlerts := true;
 Excel.Quit;
 Excel := Unassigned;
Aber was hilft das den weiter? Wie gesagt, ich bekomme den Fehler: "Falscher Variablentyp." Kann das aber nicht mit dem Code und der Variable in Verbindung bringen...

Sir Rufo 18. Nov 2011 23:29

AW: Fehler: Falscher Variablentyp
 
Zitat:

Zitat von ByTheTime (Beitrag 1136947)
Also ich weiß ehrlich gesagt nicht was es dazu noch zu sagen gibt :? Okay, das kann ich noch zusammenkratzen

Du hast da irgendwie einen bis eben unbekannten Code, der an irgendeiner Stelle einen Fehler produziert - wo, das weißt du selber nicht - und wir sollen das wissen, ohne den Code zu kennen?

Oh großer Meister-Architect, vergebe uns unsere Unwissenheit und unsere beschränkte hellseherische Gabe, aber wir sind froh, dass du dich herablässt und uns Brocken vom gesegneten heiligen zusammengekratzten Code hinwirfst, wohlwissend dass wir dessen unwürdig sind.

Ich glaube das weiß im Moment auch niemand mehr hier, denn mir fehlen ab jetzt die Worte :roll:

ByTheTime 18. Nov 2011 23:45

AW: Fehler: Falscher Variablentyp
 
Okay, Sorry, hast wohl recht, war etwas zu voreilig. Neuer Versuch: Ich habe keine Ahnung wo der Fehler auftritt. Er tritt ja nicht beim compiliren auf, sonder beim Klick auf den Button. Ich versuche nochmal etwas genaueres zu finden, und werde es morgen hier posten, aber vllt. gibt es Leute die das Problem "falscher Variablentyp." schonmal hatten. Ich kann dort nur rausinterpretieren, das er ein Problem mit meiner Variable 'Excel: Variant;' hat, aber warum, würde ich selbt gerne wissen. Eine möglichkeit hätte ich: Ich habe "Variants" nicht in den Uses eingebunden, das hatte aber bis heute noch keine Auswirkungen auf mein Programm (Wenn ich es einbinden will, mekert er auch rum!).

Stevie 18. Nov 2011 23:49

AW: Fehler: Falscher Variablentyp
 
Wie man mit dem Debugger Zeile für Zeile durch den Source geht, weißt du aber, oder? Damit findet man dann die Stelle, die den Fehler verursacht.

Sir Rufo 18. Nov 2011 23:52

AW: Fehler: Falscher Variablentyp
 
Zitat:

Zitat von Stevie (Beitrag 1136950)
Wie man mit dem Debugger Zeile für Zeile durch den Source geht, weißt du aber, oder? Damit findet man dann die Stelle, die den Fehler verursacht.

Wer ein Architect sein Eigen nennt, der weiß das
Für alle anderen:

In der IDE den Cursor in die Zeile
Delphi-Quellcode:
Excel := CreateOleObject('Excel.Application');
setzen und dann einfach mal F4 drücken.
Dann solange auf F8 bis der Fehler kommt.

Dann kennt man die Zeile, die den Fehler verursacht ...

Stevie 18. Nov 2011 23:54

AW: Fehler: Falscher Variablentyp
 
Zitat:

Zitat von Sir Rufo (Beitrag 1136951)
Zitat:

Zitat von Stevie (Beitrag 1136950)
Wie man mit dem Debugger Zeile für Zeile durch den Source geht, weißt du aber, oder? Damit findet man dann die Stelle, die den Fehler verursacht.

Wer ein Architect sein Eigen nennt, der weiß das
Für alle anderen:

In der IDE den Cursor in die Zeile
Delphi-Quellcode:
Excel := CreateOleObject('Excel.Application');
setzen und dann einfach mal F4 drücken.
Dann solange auf F8 bis der Fehler kommt.

Dann kennt man die Zeile, die den Fehler verursacht ...

So viel Sarkasmus kenn ich sonst nur von mir selber :twisted:

ByTheTime 19. Nov 2011 09:47

AW: Fehler: Falscher Variablentyp
 
Also irgendwie will das bei mir nicht, aber ich kann schonmal sagen das es ein Error vom Typ "EOleSysErro" ist.

Sir Rufo 19. Nov 2011 10:00

AW: Fehler: Falscher Variablentyp
 
Zitat:

Zitat von ByTheTime (Beitrag 1136966)
Also irgendwie will das bei mir nicht, aber ich kann schonmal sagen das es ein Error vom Typ "EOleSysErro" ist.

Was will nicht?

Wenn du in einer fremden Stadt etwas suchst, fragst du dann auch "Wie komme ich da denn hin?"?
Die Frage kannst du dir eigentlich sparen, denn die Antwort ist schon vorher klar: "Hä?"

ByTheTime 19. Nov 2011 20:58

AW: Fehler: Falscher Variablentyp
 
Also, (ihr quetscht mich ja ganz schön aus :P), mit "Es will nicht" habe ich das Programm gemeint. Aber ich habe auch eine erfreuliche Nachricht. Ich habe erst gedacht, der Fehler tritt auf, wenn ich Excel öffne, da ich erst an ein Problem mit der Excel-Variable gedacht habe. Aber es war mal wieder ganz simpel, ich habe den Fehler durch "ausklammern" gefunden (mit {} immer den Code ausgeklammert, der es sicher nicht ist bis ich ganz nahe an der Fehlerquelle bin :P).

Delphi-Quellcode:
Excel.Cells[4, 4].Value := EdName; //Was stimmt da wohl nicht?!

--> Excel.Cells[4, ].Value := EdName.Text;
Die Fehlermeldung hat mich etwas verwirrt, weil ich sie nicht mit dem Fehler in Verbindung bringen konnte... Hätte eher sowas erwartet wie 'Inkompitable Typen...'

Aber danke für den "Nachhilfeunterricht" in Sachen IDE :)

Sir Rufo 19. Nov 2011 21:07

AW: Fehler: Falscher Variablentyp
 
Weil das Ausklammern so umständlich ist, gibt es den Debugger.

Der Debugger funktioniert aber nur, wenn in den Projekt-Optionen "Debug" eingestellt ist.

Dann kann man Halte-Punkte setzen und komplett Schritt für Schritt durch das Programm gehen.

schierl 11. Jun 2012 10:53

AW: Fehler: Falscher Variablentyp
 
Hallo an alle Wissenden,

gibt es zu diesem Thema schon eine Lösung?
Ich habe das selbe Problem mit Delphi XE2, von D2005 bis zu XE hat es immer ohne Probleme geklappt!

In meinen Excel Exporten verwende ich folgende Zeile

...
ExcelWorksheet1.Cells.Item[i,1].value := q_crack_bei_km['ppa_Verfahren'];
...

Wobei ExcelWorksheet1.Cells.Item[i,1].value ein OleVariant,
q_crack_bei_km ein Dataset
und q_crack_bei_km['ppa_Verfahren'] ein TStringField ist.

Wenn ich die Zeile wie folgt abändere

...
ExcelWorksheet1.Cells.Item[i,1].value := string(q_crack_bei_km['ppa_Verfahren']);
...

oder

...
ExcelWorksheet1.Cells.Item[i,1].value := q_crack_bei_kmppa_Verfahren.Value;
...

funktioniert es wieder ohne Problem!
Bei den anderen Typen wie TIntegerField oder TFloatField tritt dieser Effekt nicht auf!
Genauso wenn ich es mit Delphi XE compiliere tritt der Fehler auch nicht auf.
Ich würde mir aber gerne ersparen alle TStringField ab jetzt zu casten!
Sollte ich noch etwas vergessen haben oder mehr Source Notwendig sein bitte bescheid geben!

Danke schon mal im Voraus

Johann

himitsu 11. Jun 2012 11:44

AW: Fehler: Falscher Variablentyp
 
Zitat:

Delphi-Quellcode:
ExcelWorksheet1.Cells.Item[i,1].value := string(q_crack_bei_km['ppa_Verfahren']);

Das Ziel ist ja ein Variant/OleVariant und das andere ein Objekt.
Grundsätzlich solltest du einfach immer davon ausgehn, daß es nicht einfach so eine Konvertierunbg von Ojekt in was Anderes gibt.

Vor einer Weile wurde zwar Delphi-Referenz durchsuchenTObject.ToString eingeführt, aber dieses wurde noch nahezu nirgendwo verwendet/überschrieben, denn dieses muß für jeden Objekttyp einzeln implementiert werden, da es von alleine nicht weiß, wie der Inhalt dieses Objektes in ein String umgewandelt werden könnte.
Somit ist es auch nicht sicher, was die String(...)-Konvertierung zurückgibt, da sie am Ende "hoffentlich" auf ToString gemäppt wird.
(Sollte hier direkt der Objektzeiger in einen Stringzeiger gecastet werden, dann hast du ein großes Problem)

Wenn es sich bei dir um TField-Nachfahren handelt, solltest du besser immer .Value verwenden, oder notfalls einfach immer .AsString (was ja auch bei Integer und Co. ginge).

schierl 11. Jun 2012 13:58

AW: Fehler: Falscher Variablentyp
 
Hallo himitsu,

Zitat:

Grundsätzlich solltest du einfach immer davon ausgehn, daß es nicht einfach so eine Konvertierunbg von Ojekt in was Anderes gibt.
du hast natürlich vollkommen recht, aber der Code denn ich verwende funktioniert schon seit Jahren so (Delphi 7 bis XE).
Ich bin gerade dabei alle meine Programme auf Delphi XE2 umzustellen und dabei über das Problem gestolpert.
Ich kann mir nicht vorstellen, daß eine Konvertierung die es schon seit Jahren gibt, auf einmal nicht mehr geht.
Das von dir zitierte Beispiel wäre auch der schlechteste Fall um das Problem zu beheben.
Änderung zwei ist mein Favorit derzeit, gefällt mir aber so nicht.
Der Aufruf DataSet['Variablenname'] ist einfach flexibler als der Aufruf DataSetVariablenname.Value. In einigen Fällen
ermitlle ich erst zur Laufzeit wie die Variable heist und exportiere sie dann nach Excel. Und wie schon erwähnt funktioniert
das mit allen Typen ausser mit TStringField in der Kompination mit TDataset.

p80286 11. Jun 2012 14:05

AW: Fehler: Falscher Variablentyp
 
Zitat:

Zitat von schierl (Beitrag 1170304)
Ich kann mir nicht vorstellen, daß eine Konvertierung die es schon seit Jahren gibt, auf einmal nicht mehr geht.

So wenig Phantasie?
Auch wenn ich Deine Emotionen verstehen kann, Du solltest zunächst einmal das Verhalten des Compilers akzeptieren und bei Gelegenheit Deine Schlüsse daraus ziehen.

Gruß
K-H

schierl 11. Jun 2012 14:24

AW: Fehler: Falscher Variablentyp
 
Zitat:

Zitat von p80286 (Beitrag 1170306)
Zitat:

Zitat von schierl (Beitrag 1170304)
Ich kann mir nicht vorstellen, daß eine Konvertierung die es schon seit Jahren gibt, auf einmal nicht mehr geht.

So wenig Phantasie?
Auch wenn ich Deine Emotionen verstehen kann, Du solltest zunächst einmal das Verhalten des Compilers akzeptieren und bei Gelegenheit Deine Schlüsse daraus ziehen.

Das dürfte woll stimmen :-D denn ich verstehe diese/n Antwort/Kommentar leider nicht!
Was hat das mit dem Thema zu tun? Oder versteht man darunter die Aussage 'It's not a bug, it's a feature!'
Ich sehe das ganze eigentlich ziemlich Emotionslos sondern eher so das es sicher viele Leute gibt,
die mehr wissen und verstehen als ich.

Gruß

Johann

Iwo Asnet 11. Jun 2012 16:56

Zitat:

Zitat von schierl (Beitrag 1170277)
...
Wobei ExcelWorksheet1.Cells.Item[i,1].value ein OleVariant,
q_crack_bei_km ein Dataset
und q_crack_bei_km['ppa_Verfahren'] ein TStringField ist.

Der letzte Satz ist nicht korrekt: Es muss heißen
Zitat:

Zitat von Der Klugsch...
und q_crack_bei_km['ppa_Verfahren'] ein TStringField Variant ist.

Neuerdings verwendet Delphi WideString, wenn irgendwo 'String' steht. Ich vermute, das steht in direktem Zusammenhang. Denn so gesehen ist an deinem Code nichts verwerfliches festzustellen.

Die Sache mit den Emotionen und der fehlenden Phantasie verstehe ich auch nicht so ganz.

himitsu 11. Jun 2012 17:21

AW: Fehler: Falscher Variablentyp
 
[QUOTE=Iwo Asnet;1170328]Der letzte Satz ist nicht korrekt: Es muss heißen
Zitat:

Zitat von Der Klugsch...
und q_crack_bei_km['ppa_Verfahren'] ein TStringField Variant ist.

Wobei das eine komplett andere Aussage darstellt ... meine Antwort war natürlich uf das TStringField bezogen.

Zitat:

Zitat von Iwo Asnet (Beitrag 1170328)
Neuerdings verwendet Delphi WideString, wenn irgendwo 'String' steht. Ich vermute, das steht in direktem Zusammenhang. Denn so gesehen ist an deinem Code nichts verwerfliches festzustellen.

Seit Delphi 2009 ist String (nicht der ShortString) ein Alias für den Delphi-Referenz durchsuchenUnicodeString und davor zeigte er auf den Delphi-Referenz durchsuchenAnsiString.
Der Delphi-Referenz durchsuchenWideString ist ein komplett eigenständiger Stringtyp.

LongString = AnsiString und UnicodeString sind quasi aufgemotzte dynamische Arrays of AnsiChar/WideChar
ShortString = ShortString und String[123] sind Records mit einem statischen Array of AnsiChar
WideString = ein Wraper für OleString (MSDN-Library durchsuchenSysAllocString und Freunde)

schierl 12. Jun 2012 08:19

AW: Fehler: Falscher Variablentyp
 
Danke an den Iwo Asnet für die Richtigstellung, bei dem Versuch soviel Information wie möglich zu geben,
habe ich mich dann ver(w)irrt und entschuldige mich dafür!:oops:

schierl 13. Jun 2012 15:00

AW: Fehler: Falscher Variablentyp
 
Ich noch mal!
Für alle die vieleicht das selbe Problem haben hier meinen Lösungsansatz!
Den Codeabschnitt
Code:
ExcelWorksheet1.Cells.Item[i, 1].Value := q_crack_bei_km['Variable1'];
ExcelWorksheet1.Cells.Item[i, 2].Value := q_crack_bei_km['Variable2'];
ExcelWorksheet1.Cells.Item[i, 3].Value := q_crack_bei_km['Variable3'];
ExcelWorksheet1.Cells.Item[i, 4].Value := q_crack_bei_km['Variable4'];
ExcelWorksheet1.Cells.Item[i, 5].Value := q_crack_bei_km['Variable5'];
der in der Zeile 1 und 3 den Fehler 'Falscher Variablentyp' gebracht hat,
habe ich ersetzt durch
Code:
for j := 1 to q_crack_bei_km.FieldCount - 1 do
  ExcelWorksheet1.Cells.Item[i,j].Value := q_crack_bei_km.FieldList[j].DisplayText;
Vieleicht hilft es ja jemanden!

Gruß

Johann

Bummi 13. Jun 2012 16:20

AW: Fehler: Falscher Variablentyp
 
@schierl
kein Problem mit Fließkommazahlen?

schierl 13. Jun 2012 16:32

AW: Fehler: Falscher Variablentyp
 
Bisher noch nicht, habe aber erst ca. 20% umgestellt!
Ich schätze mal das ich bis Freitag damit fertig bin und
wenn was auffällt schreibe ich es!

himitsu 13. Jun 2012 18:54

AW: Fehler: Falscher Variablentyp
 
Er meinte vorallem wegen dem , und . , welches im DisplayText eventuell anders dargestellt wird, was bei der Rückumwandlung im Variant eventuell Probleme bereitet.
Intern und vorallem für eine weitere Verarbeitung würde ich darum nicht unbedingt den DisplayText verwenden.

schierl 14. Jun 2012 08:38

AW: Fehler: Falscher Variablentyp
 
Ok, ein Problem gelöst ein anderes damit eingetreten :?.
Ich habe das ganze jetzt noch mal erweitert.
Code:
for j := 0 to q_crack_bei_km.FieldCount - 1 do begin
  if q_crack_bei_km.FieldList[j].DataType=ftstring then
    ExcelWorksheet1.Cells.Item[i,j+1].Value := q_crack_bei_km.FieldList[j].DisplayText
  else
    ExcelWorksheet1.Cells.Item[i,j+1].Value := q_crack_bei_km[q_crack_bei_km.FieldList[j].DisplayName];
end;

Bummi 14. Jun 2012 10:16

AW: Fehler: Falscher Variablentyp
 
sicher ein "Vertipser" >> DisplayName

schierl 14. Jun 2012 13:56

AW: Fehler: Falscher Variablentyp
 
jain, für die erste Zeile im Excel verwende ich DisplayName und die Datenzeilen FieldName!


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