Fehler bei Wert zuweisung

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Fehler bei Wert zuweisung

Beitrag von EugenE »

hi leude,

ich habe in einer Anwendungen mehrere Forms und brauche zb in 2 oder 3 eine variable , die alle verwenden.

Da habe ich versucht diese in eine extra pas datei zuspeichern

Code: Alles auswählen

unit variablen;
 
{$mode objfpc}{$H+}
 
interface
 
 
uses
  Classes, SysUtils, Controls, StdCtrls, ComCtrls, ExtCtrls, Forms, Windows;
 
type
    VarX = class
    private
       VPath : string;
       LConfig : Boolean;
       procedure setPath(path: String);
       procedure loadConfig(action : Boolean);
    public
       property Path : string read VPath write setPath;
       property Config : Boolean read LConfig write loadConfig;
    end;
 
implementation
    procedure VarX.setPath(path: String);
    begin
        //VPath := path;
        self.VPath := path;;
    end;
    procedure VarX.loadConfig(action: Boolean = false);
    begin
        LConfig := action;
    end;
end.


wenn ich jez versuche die Variable Path zu füllen mit diesem Code

Code: Alles auswählen

Vars : VarX;


Code: Alles auswählen

Vars.Create; //mit oder ohne create versucht
    Vars.Path := 'blubb';
    //Vars.Path := ExtractFilePath(Application.ExeName); //Geht auch nich


Kommt immer dieser Fehler:

Ausführung angehalten.

Prozedure: fpc_ansistr_decr_ref

oder habt ihr eine andere lösung wie man eine Variable in mehreren Forms aufrufen/neu zuweisen kann?

MfG,
Eugen

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Hallo Eugen!

Sehe ich das richtig?: Du möchtest die Variablen und Prozeduren und Funktionen der Unit Variablen in anderen units verwenden?

Dann reicht es, in den anderen units direkt unter "Implementation" folgende Zeile anzufügen:

[code="laz"]uses variablen;[/code]

Viele Grüße, Euklid

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

habe ich geändert , kommt immernoch der selbe fehler , ich will zb nur die path variable einmal zuweisen und dann in jeder unit lesen können

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Hallo EugenE,

das Objekt mal mit

Code: Alles auswählen

Vars := VarX.Create;

richtig erzeugen. (TVarX wäre ein besserer Name)

Für sogenannte 'globale Variablen', verwende doch ganz einfach eine Unit, in die du die benötigten Variablen reinpackst. Der 'implementation' Bereich bleibt halt leer.

Andi
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

meinst du es so

Code: Alles auswählen

var
  path: string;


nur wie kann man dann auch noch die Path Variable sofort mit abspeichern ohne eine Prozedure zu benutzen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Hallo Eugen,

ich würde sagen, du erklärst mir ein bischen genauer, was du machen willst, dann kann ich dir eine bessere Antwort bieten.

nur wie kann man dann auch noch die Path Variable sofort mit abspeichern ohne eine Prozedure zu benutzen


Die Möglichkeiten:

*) Wie du schon angefangen hast, ein Objekt dafür zu benutzen. Dannmusst Du das Objekt richtig erzeugen und kannst deine Initialisierung ev. in das Create hineinpacken

*) Du verwendest globale Variablen, dann muss dein Programm die Variablen befüllen. In der OnCreate von deinem Hauptforular ist eine Möglichkeit

*) Du verwendest die Intialisierung der Unit dazu um deine Variablem zu befüllen.

Einfach sagen, was du bezweckst und man kann über die Wege besser sprechen, bzw. ein bischen mehr Beispielcode herzeigen.

Andi
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Hey Andi,

also ich habe damals versucht in der main unit , die variable path mit dem pfad zufüllen, welches auch gelang, dann wollte ich diese variable in den anderen units aufrufen können

habe dafür das hier benutzt

Code: Alles auswählen

uses main; //Main ist hier die erste Unit der Anwendung


beim compilieren kam kein fehler

wenn ich jez die zweite form aufrufen wollte , kam irgendein fehler (sry weiß jez nich mehr welcher , weil ich ein anderes verfahren versucht habe, dazu etwas später^^)

nach mehreren versuchen diesen fehler zu korrigieren habe ich es dann versucht die path-variable in eine externe klasse zu speichern , nur beim speichern der path variable kommen die vorher aufgeschriebenen fehler^^

kurz gesagt ich will nur den path des programms nur in der main unit speichern und in den anderen units auch verwenden können nur geht es in meinen 2 versuchen nicht , hoffe das konnte es etwas erklären wo mein fehler liegt / was ich machen will

MfG,
Eugen

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

EugenE hat geschrieben:hoffe das konnte es etwas erklären wo mein fehler liegt / was ich machen will


Nicht so wirklich. Eigentlich wurde die Lösung ja schon mehrfach gesagt.
Mach eine neue Unit z.B. namens Variablen.
Dort definierst Du alle globalen Variablen.
Dann kannst du diese Unit überall einbinden, ohne Probleme mit Kreuzreferenzen.
Irgendwo musst du die Variablen natürlich noch mit Werten füllen. Es ist aber egal wo, da es ja globale Variablen sind. Natürlich am Besten bevor die Werte verwendest. ;-)

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

EugenE, wenn du externe Dateien verwendest, musst du die natürlich erst einbinden. Ich nehme an, das jast du gemacht...?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

EugenE hat geschrieben:kurz gesagt ich will nur den path des programms nur in der main unit speichern und in den anderen units auch verwenden können


Übrigens: Wenn du wirklich nur den Anwendungspfad brauchst, so kannst du denn immer und überall mit
ExtractFilePath(Paramstr(0));
erhalten.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Hallo Eugen,

ich glaube jetzt habe ich es.

Folgende Demo:

Ein Formular mit einem Label und eine Datenunit.
Hier das Formular

Code: Alles auswählen

unit Unit1; 
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
  { TForm1 }
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
uses daten;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := path;
end;
initialization
  {$I unit1.lrs}
end.

und die Datenunit:

Code: Alles auswählen

unit daten;
{$mode objfpc}{$H+}
interface
var
  path: string;
implementation
uses sysutils;
initialization
  path := ExtractFilePath(paramstr(0));
end.


Das ganze kompiliert und ich glaube, das macht das, was du wolltest.

Das geht dort in der unit nicht, da du da Applikationsobjekt dort nicht zur Verfügung hast:
//Vars.Path := ExtractFilePath(Application.ExeName); //Geht auch nich

sondern dort musst du auf den aufrufparameter zurückgreifen (unter windows gehts jedenfalls) und paramstr(0) ergibt immer den Aufruf des Programmes inklusive Pfad.

Andi
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

WoW geil , DANKE an ALLE ;) , ich kann jetzt wenigstens etwas aufatmen dank euch ;)

Antworten