Entwickler-Ecke

Sonstiges (Delphi) - Problem Combobox und Datenfeld


Fredy - Sa 16.05.09 17:28
Titel: Problem Combobox und Datenfeld
Hallo liebe Community,

Stehe gerade vor einem Problem bei dem ich nicht mehr weiter weiß.

Bei diesem Befehl sagt Delphi mir [Error] Unit19.pas(237): Incompatible types: 'Char' and 'TCaption'


Delphi-Quelltext
1:
Angebot_RechnungSatz.datArtikel1[0] := cbArtikel.Text;                    


Hat jemand eine Idee wie ich das Gelöst bekomme ?


Xentar - Sa 16.05.09 17:37

Was ist denn Angebot_RechnungSatz für ein Typ?


JayEff - Sa 16.05.09 17:37

Angebot_RechnungSatz.datArtikel1[0] := cbArtikel.Text;Ich würde darauf tippen, dass die Eigenschaft datArtikel1 ein String ist, und keine Stringliste (Ich weiß nicht, was Angebot_RechnungsSatz ist... :nixweiss: Musst du schon dazu sagen ;) )
Wenn das so ist, dann versuchst du, in das nullte Zeichen einen ganzen String zu schreiben, was, mal abgesehen davon, dass ein String bei 1 anfängt zu zählen und darum kein nulltes Zeichen existiert, die Fehlermeldung erklärt. Lasse mal den Index weg: Angebot_RechnungSatz.datArtikel1 := cbArtikel.Text;
Wenn das nicht hilft, poste mal die deklaration von Angebot_RechnungsSatz.


Fredy - Sa 16.05.09 17:45

das war nur als Bsp. gedacht meine Ausführung sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
IF Angebot_RechnungSatz.datArtikel1[i] = '' then
    begin
      Angebot_RechnungSatz.datArtikel1[i+1] := cbArtikel.Text;
    exit;
    end;



Delphi-Quelltext
1:
2:
3:
  Angebot_RechnungSatz         : Angebot_RechnungRecord;   // Recordvariable
  Angebot_RechnungDatei        : Angebot_RechnungFile;     // Dateivariable
  Angebot_RechnungArray        : Array of Angebot_RechnungRecord;


Noch eine kurz Erklärung wozu das dienen soll.

Wenn ich in der Combobox einen Eintrag auswähle, soll dieser in dem Angebot_RechnungSatz.datArtikel1[1] gespeichert werden, die nächste Auswahl in der Combobox dann in Angebot_RechnungSatz.datArtikel1[2].

Hab es am Anfang in zwei einzelne Dateien geschrieben datArtikel1 und datArtikel2 das ging einbandfrei aber das konnte ich nicht realisieren bei einer späteren Benutzung. Deswegen müssen alle Ausgewählten Artikel in ein Datenfeld Angebot_RechnungSatz.datArtikel1 übernommen werden.


Xentar - Sa 16.05.09 18:01

Hng, jetzt wissen wir immer noch nicht, wie das Ding definiert ist.
WAS ist Angebot_RechnungSatz.datArtikel1 ?


Regan - Sa 16.05.09 18:09

Vielleicht so?

Delphi-Quelltext
1:
Angebot_RechnungSatz.datArtikel1[0] := PChar(cbArtikel.Text);                    


Fredy - Sa 16.05.09 18:21

das hast du gemeint ups Endschuldigung


Delphi-Quelltext
1:
datArtikel1         : string[20];                    


@ Regan das hab ich auch schon probiert geht nicht kommt eine andere Fehlermeldung ;)


Xentar - Sa 16.05.09 18:39

user profile iconFredy hat folgendes geschrieben Zum zitierten Posting springen:
... geht nicht kommt eine andere Fehlermeldung ;)

:autsch: :autsch:
Dann verrat die uns doch direkt..


Der Fehler muss aber anscheinend woanders liegen.

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
var test: string[20];
begin
  test := ComboBox1.Text;
end;

geht ohne Probleme. Zeig doch endlich mal mehr Code.. Deklarationen, was vor der fehlerhaften Zeile steht, usw.

Edit: Ähh, moment, ich seh da grad was.
WARUM die eckigen Klammern?

Delphi-Quelltext
1:
Angebot_RechnungSatz.datArtikel1[i+1] := cbArtikel.Text;                    

Du bist hier in einem String.. mit eckigen Klammern greifst du auf einen bestimmten Buchstaben zu, da kannst du logischerweise keinen String reinstopfen.
Kann es sein, dass du in der Deklaration ein Array meinst?


Fredy - Sa 16.05.09 18:44

Diese Fehlermeldung kommt:


Delphi-Quelltext
1:
[Error] Unit19.pas(237): Incompatible types: 'Char' and 'PAnsiChar'                    


Vorher:


Delphi-Quelltext
1:
2:
3:
procedure TfrmRAEingabe.btnStartClick(Sender: TObject);
var i : integer;
begin


Nachher


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
IF Angebot_RechnungSatz.datArtikel1[i+1] = '' then
    begin
      Angebot_RechnungSatz.datArtikel1[i+2] := cbArtikel.Text; 
    exit;
    end;

IF Angebot_RechnungSatz.datArtikel1[i+1] = '' then
    begin
      Angebot_RechnungSatz.datArtikel1[i+3] := cbArtikel.Text; 
    exit;
    end;


Edit: Stimmt du hast Recht müsste ein Array draus machen upps


Xentar - Sa 16.05.09 18:45

Joa, hat sich schon erledigt, hatte da was übersehen.

Mach nen Array[1..20] draus, statt einen String[20].


Fredy - Sa 16.05.09 18:52


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
  //------------------------------------------------------------------------------
  //--------------------------- Angebot_RechnungRecord----------------------------
  //------------------------------------------------------------------------------

  type Angebot_RechnungRecord = record
       datNr               : longint;
       datVersion          : string[40];
       datNachname         : string[40];
       datVorname          : string[40];
       datFirma            : string[40];
       datMail             : string[40];
       datTel              : string[40];
       datLand             : string[40];
       datPLZ              : longint;
       datORT              : string[40];
       datStrasse          : string[40];
       datVersandart       : string[20];
       datMitarbeiter      : string[20];
       datRechnungsdatum   : string[40];

       datArtikel1         : Array[1..20of string// of string dann oder ?

       datWarenwert        : double;
       datVersandkosten    : double;
       datZwischensumme    : double;
       datMWST             : double;
       datEndbetrag        : double;

     end;

     Angebot_RechnungFile           = file of Angebot_RechnungRecord;

  //------------------------------------------------------------------------------
  //--------------------------- Ende Angebot_RechnungRecord-----------------------
  //------------------------------------------------------------------------------



Jetzt bekomm ich eine andere Fehlermeldung und zwar diese :


Delphi-Quelltext
1:
[Error] Unit1.pas(199): Type 'Angebot_RechnungRecord' needs finalization - not allowed in file type                    


Xentar - Sa 16.05.09 18:54

Ach, du hast da auch noch typisierte Dateien.
Das geht nicht mit Strings, da dessen Größe nicht fest steht.

Versuch mal mit ShortString. Das hat immer eine feste Größe von 255 Zeichen, sollte also eigentlich gehen.


Fredy - Sa 16.05.09 18:59

Noch ein paar Sachen geändert das Starten geht schon mal. Ich schreib direkt zurück obs funktioniert ;)

Edit: Neues Problem hinzugekommen ;) und zwar wenn ich das Formular starte kommt eine Fehlermeldung

Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.

Delphi-Quelltext
1:
txtNummer.text := IntToStr(Angebot_RechnungArray[i].datNr);                    


Ich glaube das leigt daran das ich hier auch das i benutzt habe.


JayEff - So 17.05.09 18:22

"Lesen von Adresse 00..0" deutet darauf hin, dass du versuchst, ein Objekt zu lesen, das nicht im Speicher existiert, in deinem Fall würde ich vermuten, dass Angebot_RechnungArray über seine Grenze hinaus gelesen wurde, dass also i zu klein oder zu groß geworden ist, das wär zumindest meine Vermutung. Dann wiederrum, bei ausgeschalteter Bereichsprüfung in den Debugger-Optionen sollte Delphi eigentlich gnadenlos falsch auf den Speicher zugreifen, wenn i zu groß wird ... :nixweiss: in jedem Fall solltest du dir nochmal genau anschauen, welche Werte i annimmt und welche es annehmen darf (Im zweifelsfall dann eben den Code posten, wo das array deklariert ist bzw falls du SetLength aufrufst eben auch diese Zeile. Auch müsste man natürlich den Code sehen, bei dem i vorkommt, For-Schleife, vermute ich)

Edit: Übrigens solche fehlermeldungen kannst du mit STRG+C in textform kopieren, es macht dann *bim*, also nicht wundern.