PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fragen zu c++builder



Ricky
07.09.2003, 23:43
1.Wie und wo muss ich die Variablen Deklarieren, die für alle Formulare gelten sollen???
2.Wie kann ich bei ListBoxen (während das programm läuft) eigene "Items" hinzufügen(mit ner buttonclick methode)???

Jesus_666
09.09.2003, 01:30
Original geschrieben von Ricky
1.Wie und wo muss ich die Variablen Deklarieren, die für alle Formulare gelten sollen???
2.Wie kann ich bei ListBoxen (während das programm läuft) eigene "Items" hinzufügen(mit ner buttonclick methode)???

1.) Versuch's mal in der Datei, in der sich deine main() befindet; zwischen den Includes und den Funktionen.


#include <stuff.h>
#include <morestuff.h>
#include <propietarybullshit.h>
#include <stuffthatbreakslinuxcompatibility.h>

int MeineSuperVariable; //Die gilt überall! Hoffe ich...

int main()
{
cout << "Echte Coder benutzen GCC." << endl;

return 0;
}


2.) Keine Ahnung.

raiel
09.09.2003, 15:07
bin zwar schon etwas eingerostet mit BCB aber versuchs mal so:

1)
in eine Header Datei ein
#define MeineSuperVariableDieZweite = 5000

die header datei in deine formulare einbinden und das sollte laufen

2)
Normalerweise kannst du bei Listboxen das so machen
ListBox->Items->Add('neues item');

ListBox->Items ist vom Typ TStrings und enthaelt alle items die angezeigt werden.

Ricky
09.09.2003, 23:47
@Jesus666
bei c++builder gibt es dieses main nicht:confused:
@raiel
Header????

ich werds aber nochmal versuchen...

@jedenDerEsLesenWill
Neue Frage:

Wie kann ich ein "item"(eins was ausgewählt ist) entfernen???
(steht nämlich auch nicht in der Hilfedatei:'()

raiel
10.09.2003, 03:12
> Header????

ja Header, zu jeder cpp datei gibts immernoch ne .h datei.
In der h Datei (Header) steht die Definition deiner form, z.b. was fuer buttons usw. In der cpp wird dann gesagt was wobei passieren soll.


> Wie kann ich ein "item"(eins was ausgewählt ist) entfernen???

Um ein Item zu entfernen gehst du auch wieder ueber


ListBox->Items-> Delete(0); //Loescht Item an Position 0


Wenn du das Markierte Item loeschen willst dann musst du wissen welches markiert ist. Wenn du MultiSelect auf False hast (heist das du nur einen eintrag markieren kannst ist das:



ListBox->Items-> Delete(ListBox1->ItemIndex);


Wenn du MultiSelect auf True hast (also mehrere Markieren) dann sollte das so aussehen



for (i=ListBox->Items->Count-1;i>=0;i--)
{
if (ListBox->Selected[i]) { ListBox->Items-> Delete(i); }
}



> (steht nämlich auch nicht in der Hilfedatei)

steht schon alles da, du musst dir nur die Properties und Methoden der Klasse ListBox ansehen und da sieht man dann das es sowas wie Selected, SelCount, ItemIndex gibt. Da klickt man dann drauf und liest sich das durch. ListBox->Items ist vom Typ TStrings, davon die hilfe aufgemacht zeigt einem methoden wie Delete, Add etc.

Ricky
11.09.2003, 23:57
also gut, nochmal bitte
das ist mein code am anfang

#include <vsl\vcl.h>

#pragma hdrstop

#include "Vokabeltrainerr.h"
#include "VokabeltrainerHilfe.h"
#include "VokabeltrainerCreate.h"

#pragma resource "*.dfm"

TForm1 *Form1;

wo und wie muss ich jetzt diese globale Variable (die sich VOK nennt) deklarieren (und wie)????:confused: :confused: :confused: :confused: :confused: :confused:

Jesus_666
12.09.2003, 01:03
Original geschrieben von Ricky

#include <vsl\vcl.h>

#pragma hdrstop

#include "Vokabeltrainerr.h"
#include "VokabeltrainerHilfe.h"
#include "VokabeltrainerCreate.h"

#pragma resource "*.dfm"

TForm1 *Form1;

Hmm, oben sind Preprocessor-Direktiven; das unten ("TForm1 *Form1;") sieht aus wie die Definition einer Variable (Form1 vom Typ TForm1).
Schreib' da einfach mal deine Varieble drunter, in etwa so:
#include <vsl\vcl.h>

#pragma hdrstop

#include "Vokabeltrainerr.h"
#include "VokabeltrainerHilfe.h"
#include "VokabeltrainerCreate.h"

#pragma resource "*.dfm"

TForm1 *Form1;
void VOK;...wobei du "void" mit dem für die Variable vorgesehenen Datentyp ersetzt.

Ricky
12.09.2003, 02:18
"TForm1 *Form1" ist einfach nur für das Formular 1, also keine Variable, und wenn ich die deklaration darunter mache, dann gilt es nur für die eine Unit, es soll ja aber für alle gelten

Jesus_666
12.09.2003, 03:54
Original geschrieben von Ricky
"TForm1 *Form1" ist einfach nur für das Formular 1, also keine Variable, und wenn ich die deklaration darunter mache, dann gilt es nur für die eine Unit, es soll ja aber für alle gelten

Entweder benutzt du da ein C++, daß gar nichts mit dem Standard zu tun hat (was bei C++b nicht sein sollte), oder du benutzt eine Art von Deklarierung, die extrem unbekannt ist...
Oder da wird eine Variable Form1 vom Typ TForm1 deklariert... Genauer gesagt, ein Pointer.

Form1 verweist auf irgendeine Adresse, die Daten vom Typ TForm1 enthält (ich gehe davon aus, daß TForm1 ein struct ist). Und es ist eine Variable (wenn ich mich nicht irre, siehe oben).

Ansonsten versuch's doch einfach mal mit raiel's Vorschlag. Und wenn die Datei keinen Header hat, dann machst du einen:
- Textdatei mit der Dateiendung .h erstellen
- VOK in der Datei deklarieren
- Die Datei in deinem Projekt includen

raiel
12.09.2003, 15:07
Mach dir einfach eine neue Datei die du z.b. globals.h nennst. Da schreibst du dann folgendes rein:



//---------------------------------------------------------------------------
#ifndef _GLOBAL_VARS_
#define _GLOBAL_VARS_

#define VOK 5000
#define SVOK "constantstring constantstring constantstring EOS"

#endif


in die anderen dateien wo du die variable benutzen willst schreibst du dann oben ein


#include "globals.h"

und schon hast du die Variablen definiert und belegt.

Wenn du es wie Jesus_666 sagt machst naehmlich nicht #define sonder "int vok = 5000" geht das auch allerdings muss dann immer wenn du das woanders benutzen willst erst ein "extern vok;" gemacht werden damit er weis das die woanders declariert ist.

Wenn das alles nicht geht dann musst du eine Singleton klasse machen die dir die Constanten als funktions-results zurueckgibt. Das ist allerdings nicht besonders schoen da funktionen Resourcen und zeit belegen.


> TForm1 *Form1;

BCB haelt sich nicht unbedingt an ANSI standards. Was hier gemacht wird ist das Form1 vom Typ eines TypDef's ist welches die form und alle komponenten enthaelt. Beim BCB wie auch bei Delphi koennen die Form's automatisch von delphi erzeugt und wieder freigegeben werden. Das heist das man sich nicht selber mit Constructoren rumschlagen muss. Diese Variable Form1 ist dann das wo delphi seine automatisch generierte Form drinne ablegt. Ist ein wenig dirty aber es geht nicht anders.

Jesus_666
12.09.2003, 20:04
Original geschrieben von raiel
Mach dir einfach eine neue Datei die du z.b. globals.h nennst. Da schreibst du dann folgendes rein:
[...]
in die anderen dateien wo du die variable benutzen willst schreibst du dann oben ein


#include "globals.h"

und schon hast du die Variablen definiert und belegt.

Wenn du es wie Jesus_666 sagt machst naehmlich nicht #define sonder "int vok = 5000" geht das auch allerdings muss dann immer wenn du das woanders benutzen willst erst ein "extern vok;" gemacht werden damit er weis das die woanders declariert ist.

Wenn das alles nicht geht dann musst du eine Singleton klasse machen die dir die Constanten als funktions-results zurueckgibt. Das ist allerdings nicht besonders schoen da funktionen Resourcen und zeit belegen.


> TForm1 *Form1;

BCB haelt sich nicht unbedingt an ANSI standards. Was hier gemacht wird ist das Form1 vom Typ eines TypDef's ist welches die form und alle komponenten enthaelt. Beim BCB wie auch bei Delphi koennen die Form's automatisch von delphi erzeugt und wieder freigegeben werden. Das heist das man sich nicht selber mit Constructoren rumschlagen muss. Diese Variable Form1 ist dann das wo delphi seine automatisch generierte Form drinne ablegt. Ist ein wenig dirty aber es geht nicht anders.

In etwa so habe ich mir das auch vorgestellt. Nonstandard-Code ist zwar nicht gerade toll (Standards sind gut, m'kay?), aber solche Workarounds und obskure Lösungen scheinen ja eh das zu sein, was C++ ausmacht...

Darauf, die Variable einfach über den Preprocessor zu definieren wäre ich nicht gekommen... Okay, ich bin auch noch ein kleiner C-n00b. ^^ *aufschreib*

Ricky
12.09.2003, 22:11
:'( aaaah ich versteh gar nöscht meer!!!:'(
ich hab keine Ahnung was includen heißt, ich kenne mich mit includes auch gar net aus, das wird alles automatisch gemacht...und "mach dir einfach eine neue Datei" häääää was meinst du??? wie neue datei???

bitte sagt mir einfach nur, wo/wie ich die Variable daklarieren muss:


#include <vsl\vcl.h>

#pragma hdrstop

#include "Vokabeltrainerr.h"
#include "VokabeltrainerHilfe.h"
#include "VokabeltrainerCreate.h"

#pragma resource "*.dfm"

TForm1 *Form1;

raiel
12.09.2003, 22:35
*sigh*,

also schoen, stellen wir uns mal janz dumm:



01 #include <vsl\vcl.h>
02 #pragma hdrstop
03 #include "Vokabeltrainerr.h"
04 #include "VokabeltrainerHilfe.h"
05 #include "VokabeltrainerCreate.h"
06 #pragma resource "*.dfm"
07 TForm1 *Form1;


wie du hier sehr schoen siehst sind zeile 01,03-05 includes. Das heist das in der datei in der du dich gerade befindest noch 4 andere Dateien benutzt werden. Also es gibt noch 4 dateien irgendwo auf deiner Festplatte (VokabeltrainerCreate.h, VokabeltrainerHilfe.h, Vokabeltrainerr.h, vsl\vcl.h). Die vsl\vcl.h ist eine Datei welche in den Standard-Pfaden zu finden ist, gut zu erkennen an den eckigen klammern ("<",">") und in deinem fall voellig zu ignorieren :) .

Also wenn du z.b. mit notepad eine neue Text-Datei erstellst und einfach genau folgenden code reinkopierst:


//---------------------------------------------------------------------------
#ifndef _GLOBAL_VARS_
#define _GLOBAL_VARS_
#define VOK 5000
#define SVOK "constantstring constantstring constantstring EOS"
#endif

diese dann als globals.h da hinspeicherst wo dein projekt drinne liegt (dort wo die VokabeltrainerCreate.h, VokabeltrainerHilfe.h, Vokabeltrainerr.h sind). Dann brauchst du nur noch irgendwo zwischen zeile 03 und zeile 05 folgendes einfuegen:


#include "globals.h"


was dann im endeffekt so aussieht:


01 #include <vsl\vcl.h>
02 #pragma hdrstop
03 #include "Vokabeltrainerr.h"
04 #include "VokabeltrainerHilfe.h"
05 #include "VokabeltrainerCreate.h"
06 #include "globals.h" // <--- Hier ist das 'include'
07 #pragma resource "*.dfm"
08 TForm1 *Form1;


[End of Explanation]

----------------------------------------------------

wenn dir dass alles immernoch zu kompliziert ist dann schreib die variable einfach direkt in den aktuellen Header:


01 #include <vsl\vcl.h>
02 #pragma hdrstop
03 #include "Vokabeltrainerr.h"
04 #include "VokabeltrainerHilfe.h"
05 #include "VokabeltrainerCreate.h"
06 #pragma resource "*.dfm"
07 #define VOK 5000 // <-- Hier ist die Variable
08 TForm1 *Form1;


das hat dann aber zufolge das du immer wenn du mal diese variable in einer anderen unit (datei) benutzen willst du immer ein include dieser datei machen musst.

Sehr empfehlen kann ich auch ein grundlagen tutorial zu lesen ueber dateien und strukturen von C/C++.

Ricky
12.09.2003, 22:42
ok soweit kapiert....und was gutes gelernt, aber woher weiß das programm, dass die variable vom typ bool ist???
und wie kann ich dann im programmlauf den Wert ändern??? oder ist das dann ganz normal?

Jesus_666
12.09.2003, 23:51
Du könntest in den Header (die Datei mit der Endung .h) folgende Zeile setzen:[code]bool VOK;[code]
Wenn du dann den Header in jede Datei includest hast du die Variable überall, der Compiler weiß, daß es ein Bool ist und du kannst sie verändern.
Da müßte noch Code dazu, um zu sehen, ob die Variable schon definiert ist; das lasse ich mal lieber raiel erledigen (hab' die nötigen Funktionen nicht zur Hand).


BTW... Ich scheibe meinen Code komplett in Notepad. Soll ich mir jetzt l33t oder einfach nur alt vorkommen?

raiel
15.09.2003, 16:04
moin,

also Booleans sind in C nichts anderes als integer, also:


#define VOK 1 // True
#define VOK 0 // False


Dann kannst du einfach



if (VOK)
{
//blah
} else
{
//blah^2
}


der Compiler wird dich dabei aber warnen weil sich der zustand ja nie aendert.

Jesus_666
15.09.2003, 20:28
Original geschrieben von raiel
moin,

also Booleans sind in C nichts anderes als integer, also:
[...]

Dann kannst du einfach

[...]

der Compiler wird dich dabei aber warnen weil sich der zustand ja nie aendert.

Ich denke, er will eine globale, nicht konstante Variable deklarieren. Es macht also nicht viel Sinn, den Wert fest zu definieren.

raiel
15.09.2003, 23:39
hmm, ok ich hab da glaube ich aufm falschen fuss angefangen. Mit #define macht man natuerlich nur konstante werte die sich nicht aendern. Aber es waren ja globale variablen. Sei's drum ist nicht viel anders, statt:


//---------------------------------------------------------------------------
#ifndef _GLOBAL_VARS_
#define _GLOBAL_VARS_
#define VOK 1
#define SVOK "constantstring constantstring constantstring EOS"
#endif


wie Jesus_666 schon sagte also:



//---------------------------------------------------------------------------
#ifndef _GLOBAL_VARS_
#define _GLOBAL_VARS_
#define SVOK "constantstring constantstring constantstring EOS"

int VOK = 1;

#endif


wenn du nur mit C++ Builder arbeitest ist das gut und funktioniert auch. Der Compiler wird dir ne warnung melden das die Variable in mehreren Unit's deklariert wurde, kannst ignorieren. Sowas laeuft aber nicht unter Ansi C mit nem Gcc, da muss man dann in die Header der unit's in der man die variable benutzen will noch ein extern VOK; reinsetzen.

Ricky
17.09.2003, 01:19
Danke dass ihr so fleißig gepostet habt, aber ich hab jetzt ne einfachere Lösung:
einfach (über TForm1 *Form1 + TForm2 *Form2) die Deklaration
"

bool VOK;

"
und dann gehts auch....

Ricky
26.09.2003, 21:35
1. Wie kann ich meine Schrifarten in einer Cobmo-Box Anzeigen lassen???
2. ich will etwas so einstellen, dass auf druck eines Buttons eine Zahl, die in einer Textbox steht in eine Taste umgewandelt wird.

also das:

void __fastcall Form1::KeyPress(*laber* &Key *laber*)
{
Text1->Text = Key;
}

soll praktich andersherum laufen.

(bei dieser Methode wird für die Gedrückte Taste ein Ansi-Wert angezeigt bzw. die dazugehörige Taste)


hoffe ihr habt alles verstanden
bei fragen,
sagen

Ricky
28.09.2003, 03:00
Kann mir wenigstens jemand sagen, durch was die Fehlermeldung
"Listenindex außerhalb des zulässigen Berreichs" ausgelöst werden kann?

Jesus_666
28.09.2003, 04:15
Original geschrieben von Ricky
Kann mir wenigstens jemand sagen, durch was die Fehlermeldung
"Listenindex außerhalb des zulässigen Berreichs" ausgelöst werden kann?
Ich würde sagen, du hast eine Liste definiert und dann auf ein nicht definiertes Element zugegriffen. Ich demonstriere mal am Beispiel eines Arrays (und gehe mal ganz kess davon aus, daß Listen genauso funktionieren):

int blub[5];
blub[60] = 15;
Es sind die Elemente 0 bis 4 definiert, ich habe aber auf Element 60 zugegriffen und das ist Nicht Gut™.
Kann sein, daß du etwas ähnliches gemacht hast.

Ricky
28.09.2003, 04:55
1. Wie kann ich meine Schrifarten in einer Cobmo-Box Anzeigen lassen???
2. ich will etwas so einstellen, dass auf druck eines Buttons eine Zahl, die in einer Textbox steht in eine Taste umgewandelt wird.

also das:

void __fastcall Form1::KeyPress(*laber* &Key *laber*)


soll praktich andersherum laufen.

(bei dieser Methode wird für die Gedrückte Taste ein Ansi-Wert angezeigt bzw. die dazugehörige Taste)


hoffe ihr habt alles verstanden
bei fragen,
sagen

Jesus_666
28.09.2003, 05:08
Ich habe beide Fragen schon beim ersten Mal verstanden, als du sie gestellt hast.
Ich kann nur die erste nicht beantworten, weil ich mit GUI noch nichts zu tun habe (und mit der WinAPI möglichst gar nicht).
Zu der zweiten weiß ich nur, daß man Keypress irgendwie simulieren kann. Ich weiß nicht, wie das geht.