Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Variablen von Form1 auf Form2 übertragen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.03.2009, 16:49 Uhr
Dominik_88



Hi zusammen

Ich würde gerne die Variablen aus dem Form1 in Form2 lesen können, also z.B.

------------------
Form1:

int test=14;
------------------
Form2:

Label1 -> Caption = Form1 -> test;
------------------

Aber dann kommt eine Fehlermeldung:
[C++ Fehler] Unit1.cpp(16): E2316 'test' ist kein Element von 'TForm1'.

Ich will, dass Label1 im Form2 die Zahl 14 stehen soll wegen der Variable aus der Form1.

Das brauche ich für das Spiel, weil ich die Ergebnisse gerne im neuen Fenster anzeigen will und daher die Variablen aus dem ersten Fenster brauche.

Ich habe versucht "#include "Unit2.h" im Unit1 einzufügen, aber bringt nichts.

Viele liebe Grüße

Dominik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.03.2009, 16:54 Uhr
öni



du könntest den Wert aus Form 1 in eine globale Variable speichern auf die auch Form 2 zugreifen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.03.2009, 17:00 Uhr
Dominik_88



Hi Öni

Wie kann man in eine globale Variable speichern?

Ist das gemeint, dass die Variable wie z.B. test in allen Fenster anwenden können und nicht nur für diese Fenster?

Viele liebe Grüße

Dominik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.03.2009, 17:42 Uhr
öni



hab vergessen das die 2 Forms ja in seperaten *.cpp gespeichert werden.

du hast nun 2 möglichkeiten dein int test zu deklarieren.

entweder du schreibst in unit2.h dein int test rein und includierst dann unit2.h in unit1.cpp, wobei ich nicht weiß ob das die feine englische ist, geht natürlich auch anders rum ist aber immer noch nicht so schön.

oder was glaub die saubere Methode wäre du erstellst ne neue headerdatei und includierst diese in beide units.

egal wie du es machst du musst auf jeden fall "static int test" schreiben da ansonsten deine variable ohne static 2mal erstellt wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.03.2009, 19:39 Uhr
Dominik_88



Hi Öni

Gerade habe ich bei Unit2 den Unit1.cpp includet und bei Unit1 "static int test" eingefügt.
Aber dann kommt die Warnmeldung, dass Form1 in beiden Fenster definiert ist. Wie bekommt man diese Warnung wieder weg? Ohne "static int test" käme für test auch eine Warnmeldung, da in beiden Fenster definiert ist.

Das größere Problem ist, dass der Wert von test im 2.Fenster 0 ist, wenn ich vor dem Öffnen des 2.Fenster den test den Wert 3 hat.

Ich will nicht "static int test=3" eingeben, weil der Wert von test ständig ändern soll, also nicht immer den Wert 3. Sondern ich würde z.B. gerne ein Zufall für test mit den Werten 1-6 erstellen und im 2.Fenster anzeigen lassen.

Also:
----------------------
int test;

srand(time(NULL));
test=(1+(rand()%6));
----------------------

Zu der 2.Möglichkeit: Was meinst du mit Headerdatei?

Ansonsten hat es mir für deine erste Möglichkeit schon geholfen. Vielen Dank dafür.

Viele liebe Grüße

Dominik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2009, 20:02 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich jetzt richtig verstehe, worauf du hinauswillst, test darf keine lokale Variable sein, sondern muss eine Membervariable von Unit1 sein. Also etwa:

C++:
struct Unit1 {
  int test;

  void init_test();
};

void Unit1::init_test() { test = 42; }

struct Unit2 {
  int x;

  void get_test_from(Unit1 const &u1);
};

void Unit2::get_test_from(Unit1 const &u1) { x = u1.test; }

int main() {
  Unit1 u1;
  Unit2 u2;

  u1.init_test;
  u2.get_test_from(u2);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.03.2009, 15:43 Uhr
öni



Nur das Problem ist beefy das es 2 verschiedene *.cpp Dateien sind. In der es keine direkte main Funktion gibt.

@Dominik

Um mich nochmals richtig auszudrücken.

Du erstellt eine weitere *.h Datei in der nichts anderes stehen muss als
C++:
static int test;  

in den beiden *.cpp Dateien includierst du die *.h Datei, somit kennen beide *.cpp Dateien die selbe Variable test. Würdest du das static weglassen, würden beide *.cpp Dateien eine Variable test kennen, allerdings jede *.cpp nur ihre eigene Version der Variablen, somit hättest du 2 lokale Variablen mit dem Namen test. static heist nicht das die Variable nicht verändert werden darf, static heist das die Variable nur 1 mal deklariert werden soll, wenn du eine Konstante erstellen willst die einen festen nicht veränderbaren Wert hat dann musst du das Schlüsselwort const benutzen.

Sodele, nun ist es egal in welche Headerdatei (*.h) du deine Variable definierst hauptsache beide *.cpp Dateien haben die selbe *.h Datei includiert. Der Schönheit halber würde ich nun eine Datei erstellen mit der Endung *.h. Das kannst du im Borland Builder über Datei->Neu->Headerdatei, oder so, hab gerade kein BCB aufm Laptop installiert.

Dieser *.h gibst du dann einen Namen und includierst diese in beiden *.cpp Dateien


C++:
#include "wieauchimmmer.h"
und in dieser hast du deine Variablendeklaration.

Ich hoffe nun ist es klar?

Dieser Post wurde am 03.03.2009 um 15:43 Uhr von öni editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.03.2009, 19:05 Uhr
0xdeadbeef
Gott
(Operator)


Dass es in zwei verschiedenen Übersetzungseinheiten ist, ist doch völlig belanglos. Wichtig ist, dass Form1 eine Membervariable test hat, auf die Form2 zugreifen kann. Teil's halt auf:

C++:
// unit1.hpp
#ifndef INCLUDED_UNIT1_HPP
#define INCLUDED_UNIT1_HPP

struct Unit1 {
  int test;

  void init_test();
};

#endif



C++:
// unit1.cpp
#include "unit1.hpp"

void Unit1::init_test() { test = 42; }



C++:
// unit2.hpp
#ifndef INCLUDED_UNIT2_HPP
#define INCLUDED_UNIT2_HPP

#include "unit1.hpp"
struct Unit2 {
  int x;

  void get_test_from(Unit1 const &u1);
};

#endif



C++:
// unit2.cpp
#include "unit2.hpp"

void Unit2::get_test_from(Unit1 const &u1) { x = u1.test; }



C++:
// main.cpp
#include "unit1.hpp"
#include "unit2.hpp"

int main() {
  Unit1 u1;
  Unit2 u2;

  u1.init_test;
  u2.get_test_from(u2);
}



Das mit der statischen Variable wird nicht funktionieren, jede Übersetzungseinheit erhält so ihre eigene test-Instanz. Dass die Definition in einem Header steht, ist ohne Belang, schließlich fügt #include bloß Text ein. Außerdem ist die Benutzung einer globalen Variable konzeptionell unschön, weil sie zu Unit1 gehört, und praktisch unschön, weil auf die Art alle Instanzen von Unit1 die selbe Variable benutzen würden und sich dabei ständig in die Haare kämen.

Außerdem schreibt man Objekte ohne externe Linkage in C++ üblicherweise nicht als static, sondern in den namenlosen Namensraum.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 03.03.2009 um 19:07 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.03.2009, 19:50 Uhr
Dominik_88



Hi zusammen

Vielen Dank für die Antworten. Ich werde mit euren Antworten irgendwann mal versuchen, weil für mich jetzt zu kompliziert ist. Ich habe jetzt anders gemacht, denn ich habe einfach im Unit1 folgendes eingefügt:

Form2 -> Label1 -> Caption = test;

So kann ich in Form2 den Wert von test lesen.

Viele liebe Grüße

Dominik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.03.2009, 22:39 Uhr
öni



Ja, wieso net gleich so ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: