Borland Starthilfe

Cusco

Erfahrenes Mitglied
Hi,

ich bin ein Hobby Programmierer, seit 10 Jahren auf dem Amiga-Sektor in AmiBlitz2 eine Sprache in der Mischung aus Basic, C und Pascal. Was dabei Herausgesprungen ist seht ihr auf http://www.sn-archiv.de da habe ich meine Programme veröffentlicht.

Vor ca. 4 Jahren bin ich in C mit den Buch "C in 21 Tagen" eingestiegen, konnte damit auch ein paar Dos bzw Cli (So heist das Dos auf dem Amiga) - Programme schreiben, für die GUI-Programmierung fehlte mir leider die Doku bzw Hilfestellungen. :( Aber erlich gesagt war ich auch zu faul es ging ja alles so schön mit AmiBlitz2 ;-)

So heute habe ich eine Neue Version von SN-AnlagenArchiv (Edelmetallverwaltung)veröffentlicht und dann viel mir auf, das der Amiga eigentlich in die Jahre gekommen ist und es Kaum Leute gibt die noch Amiga-Software benötigen, weil der Markt immer kleiner wird - Langsam alle den Amiga verlassen und meine Software kaum genutzt wird.

Nun wird es Langsam Zeit auch auf den Windows-Markt zu springen, wenn auch nicht ganz, den Amiga werde ich weiterhin Unterstützen. Ich habe mal gehört das es nur noch 20-25 Amigaprogrammierer Weltweit geben soll (!) Ich weiss aber nicht ob mich da jemand mit gezählt hat :(

So gemacht getan ich habe mir Heute den Borland C 5.51 - Compiler installiert, einen c-source besorgt, welches einen Requester öffnen soll. Nun bekomme ich es aber nicht Compiliert weil er die Includes nicht finden kann :( Nun habe ich von Windows recht Wenig Ahnung, vorallem komm ich mit dem Schrottigen DOS nicht zurecht, die Bedienung ist ja einfach grauenvoll, ich frage mich was MS sich dabei dachte. Da bin ich vom Amiga bei weiten mehr Komform gewöhnt. Ich bin dazu über gegangen alles gleich in einen Script zu verewigen. Dabei ist folgenes entstanden:

Code:
@echo off
cls

echo.
echo. Compiler Test
echo. ---------------

cd C:\Borland\BCC55
Bin\bcc32.exe -Ixxx=Include -Lxxx=Lib -exxx=MeineProgs\Test.exe MeineProgs\Window.c

echo.
pause

Nur das Funktioniert nicht, da er wie gesagt die Include nicht finden kann, in dem Fall die Window.h. Wie muss die Zeile aussehen damit es funktioniert? Eine Zeile mit gleich Optimalen Compiler-Commandos damit er nicht nur einfach compiliert sondern auch alles richtig macht wie Optimieren wäre auch von vorteil.

C habe ich wie gesagt, mit dem amiga mehr oder weniger gelernt, aber da brauchte ich micht nicht um Compiler-Optionen kümmern, ich hatte die Komplette Umgebung mit grafischer Oberfläche vom Programm-Paket StormC4 (GCC). Aber nun sieht es erst mal anders aus unter Windows.

Es wäre auch gut wenn ihr mir einen Freeware C/C++ - Editor empfehlen könntet, das arbeiten mit dem Standart-Editor macht keinen Spass. Ich suche was mit Farbhervorhebung usw.

Wäre schön wenn ihr mir Helfen könntet :)
 
Hi.

Also mit deinem Borland Compiler Problem kann ich dir ad hoc leider nicht helfen.

Allerdings kann ich dir das MinGWStudio bzw. Dev-C++ als IDE (beide benutzen den GCC) empfehlen. Damit brauchst du dich nicht mehr um den Compiler Aufruf und die Includes zu kümmern denn bei beiden sind der Compiler, die Includes und zusätzliche Bibliotheken bereits enthalten.

Für die Borland Tools gibt es auch eine IDE wo du dann dich nicht mit der Kommandozeile rumschlagen mußt (http://www.objectcentral.com/vide.htm).

Ansonsten gibt es jede Menge gute Freeware/Opensource Editoren (http://www.freeprogrammingresources.com/editors.html) in die man auch andere Compiler usw. einbinden kann. Mir gefällt z.B. der Programmer's Notepad (http://www.pnotepad.org) ganz gut.

Vor Kurzem hat auch Microsoft die Visual C++ Express Entwicklungsumgebung zum Download freigegeben - fragt sich wahrscheinlich nur wie lange...

Gruß
 
deepthroat hat gesagt.:
Für die Borland Tools gibt es auch eine IDE wo du dann dich nicht mit der Kommandozeile rumschlagen mußt (http://www.objectcentral.com/vide.htm).

Danke für deine Hilfe, mit vide habe ich es nach einigen Probieren hinbekommen, er kompiliert :)

@all
Fragen zur Funktion von Vide:
Wie bekommt man es gebacken, das er einen Makierten Text ein oder Ausrück?
Und kann man einstellen das wenn man ne neue Zeile beginnt er zum Ersten Zeichenposition der vorherigen Zeile spring? Ich finde das sind Standart-Funktionen die jeder (C-) Editor besitzen sollte

Meine erste Gehversuche nach 2 Jahren Pause:

Code:
#define STRICT
#include <string.h>
#include <windows.h>

const char szVersion[] = "Lernprog V0.10 by Cusco";

const char szWitz[] = "\"Ich steh' schwer auf Umweltschutz!!\", sagt Peter.\n"
                      "\"Ich werfe zum Beispiel alte U-Bahn-Fahrscheine nie weg,\n"
                      "sondern benutze sie mehrmals.\"";

int InfoReq(char *szTitel,char *szText)
{
	char szFehlerText[2000] = "Es ist ein Programm-Fehler aufgetreten!!"; 
	if (szText > 0)
		{
       	  strcpy(szFehlerText,szText);
  	    }
    
    MessageBox(NULL, szFehlerText, szTitel,
                     MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);
    return 1;
}


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{

	int iAntwort = MessageBox(NULL, szWitz, "Ha, ha, ha, ha...",
                                MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);

	switch(iAntwort)
	   {
    	  case IDOK:
        	   InfoReq(szVersion,"Ja, ich finde den Witz auch Ok...");
	           break;
	      case IDCANCEL:
    	       InfoReq(&szVersion,"");
        	   break;
          default:
               InfoReq("Echter Fehler!!","");
	   }

	return 0;
}

Der Code funktioniert nicht richtig (Habe so gut wie alles gelernte wieder vergessen)
Es kommt ein Pointer-Fehlermeldung (szVersion-Übergabe) bei den ersten beiden InfoReq-Aufrufen und die InfoReq-Routiene geht auch nicht richtig, mal funktioniert sie mal nicht. Und zwar mit den Textkopieren haut was nicht hin.

Info: Wenn ein Leerstring (2. Parameter) übergeben wird dann soll er den Fehlertext von der Info-Routiene im Requester ausgeben, ansonsten den Text der übergeben wurde.

Ich hoffe mal wieder auf eure HIlfe :)
 
Cusco hat gesagt.:
Wie bekommt man es gebacken, das er einen Makierten Text ein oder Ausrück?
Und kann man einstellen das wenn man ne neue Zeile beginnt er zum Ersten Zeichenposition der vorherigen Zeile spring? Ich finde das sind Standart-Funktionen die jeder (C-) Editor besitzen sollte
Naja, mit den Standardfunktionionen ist das so eine Sache. Eigentlich sollte der V Editor den Code automatisch einrücken - allerdings hat das bei mir nicht funktioniert. Einstellen kannst du diese Sachen (da es Opensource Software ist) in den Quelldateien des Editors ;)

Cusco hat gesagt.:
Code:
const char szVersion[] = "Lernprog V0.10 by Cusco";
...
int InfoReq(char *szTitel,char *szText)
...
        	   InfoReq(szVersion,"Ja, ich finde den Witz auch Ok...");
Das Problem hier ist, das du eine als konstant deklarierte Variable als Parameter an eine Funktion übergibst, die den Wert der Variablen (über den Pointer) potentiell verändern kann. Deklariere die Parameter der Funktion am besten auch einfach als const.

Dann würde ich gar nichts mit strncpy kopieren - das ist doch viel zu aufwendig und unnötig. Du kannst doch einfach einen Pointer benutzen:
Code:
int InfoReq(const char *szTitel,const char *szText)
{
	const char szFehlerText[] = "Es ist ein Programm-Fehler aufgetreten!!";
	const char* pTitel = szFehlerText;
 
	if (szTitel != 0) pTitel = szTitel;

	MessageBox(NULL, szFehlerText, pTitel,
                     MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);
}

Cusco hat gesagt.:
Code:
	      case IDCANCEL:
    	       InfoReq(&szVersion,"");
Hier solltest du nicht die Adresse des Pointers übergeben, sondern einfach den Pointer selbst. (Arrays sind auch Pointer)

Gruß
 
Jetzt scheint mehr oder weniger alles zu Funktionieren :)
Das mit "Einfach den Pointer übergeben" ist ne sehr gute Idee, darauf hätte ich auch kommen müssen :( es wird ja schlieslich nix verändert.

Abr nun zum Problem. Wenn ich "" übergebe dann funktioniert die Abfrage nicht bei InfoReq :confused: Das heist die Abfrage wird trozdem Ausgeführt, was damit endet das das Fenster ohne Text erscheint. Nur wenn ich FALSE anstatt des Textes übergeben funktioniert es.

der Code sieht jetzt so Aus:

Code:
#define STRICT
#include <windows.h>

#define FLAG  unsigned long
#define CFLAG const unsigned long
#define STR   char
#define CSTR  const char

CSTR szVersion[] = "Lernprog V0.10 von Cusco";

CSTR szWitz[]    = "\"Ich steh' schwer auf Umweltschutz!!\", sagt Peter.\n"
                   "\"Ich werfe zum Beispiel alte U-Bahn-Fahrscheine nie weg,\n"
                   "sondern benutze sie mehrmals.\"";

int InfoReq(CSTR *pTitel,CSTR *pText)
{
    CSTR szFehlerText[] = "Es ist ein Programm-Fehler aufgetreten!!"; 
    CSTR *pIRText  = szFehlerText;
    FLAG IRIconTyp = MB_ICONERROR;
 
    if (pText != 0)
       {
       	  pIRText   = pText;
          IRIconTyp = MB_ICONINFORMATION;
       }
    
    MessageBox(NULL,pIRText,pTitel,
               IRIconTyp | MB_OK | MB_DEFBUTTON1);
    return 1;
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
    STR szWiederGut[100] = "Nun ist es ja Wieder Gut!";

    int iAntwort = MessageBox(NULL, szWitz, "Ha, ha, ha, ha...",
                   MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);

    switch(iAntwort)
      {
         case IDOK:
              InfoReq(szVersion,"Ja, ich finde den Witz auch Ok...");
              break;
         case IDCANCEL:
              InfoReq(szVersion,FALSE);
              InfoReq("Kein Fehler!",szWiederGut);
              break;
         default:
         InfoReq("Echter Fehler!!",FALSE);
       }
    return 0;
}

Ich habe mir Erlaubt die Variablentypen zu definieren für eine Einfache schreibweise und besseren Überblick. Beim Flag bin ich mir nicht sicher ob er überhaupt von Typ unsigned long sein Darf. Was ist der übliche Typ dafür? Und welche Typen gibt es, ich spreche aber dabei nicht von den Standart Variablen Typen. Auf dem Amiga gibt es z.B: ULONG für unsigned long, UBYTE für unsigned char, usw. das meine ich.
 
Cusco hat gesagt.:
Abr nun zum Problem. Wenn ich "" übergebe dann funktioniert die Abfrage nicht bei InfoReq :confused: Das heist die Abfrage wird trozdem Ausgeführt, was damit endet das das Fenster ohne Text erscheint. Nur wenn ich FALSE anstatt des Textes übergeben funktioniert es.
Wie gesagt, C-Strings sind nur Pointer - und wenn du den Pointer mit einem Integer vergleichst dann sagt das nichts über den String(-Inhalt) aus. Es wird nur festgestellt ob der übergebene Wert ein NULL-Pointer ist. FALSE ist eine Präprozessorvariable welche zu 0 evaluiert - was dem Wert eines Nullpointers entspricht.

Wenn du auch prüfen willst, ob es sich bei dem übergebenen String um einen Leerstring handelt mußt du einfach nur das erste Zeichen überpfrüfen ob es gleich '\0' ist (ein Zeichen mit dem Code 0 bzw. NUL).
Code:
int InfoReq(CSTR *pTitel,CSTR *pText)
{
    CSTR szFehlerText[] = "Es ist ein Programm-Fehler aufgetreten!!"; 
    CSTR *pIRText  = szFehlerText;
    FLAG IRIconTyp = MB_ICONERROR;
 
    if (pText != 0 || pText[0] == '\0') ...

Cusco hat gesagt.:
Ich habe mir Erlaubt die Variablentypen zu definieren für eine Einfache schreibweise und besseren Überblick.
Ich persönlich finde ja die ganzen Präprozessordefinitionen ganz schon lästig. Vor allem wenn die so irreführend bennant sind wie deine :) Naja, CSTR könnte "C-String" bedeuten oder aber "Constant String", allerdings ist der Typ gar kein String sondern nur ein einzelnes Zeichen! Müßte also eigentlich CCHAR heißen... Ich benutze dann lieber typedefs.

Cusco hat gesagt.:
Beim Flag bin ich mir nicht sicher ob er überhaupt von Typ unsigned long sein Darf. Was ist der übliche Typ dafür? Und welche Typen gibt es, ich spreche aber dabei nicht von den Standart Variablen Typen. Auf dem Amiga gibt es z.B: ULONG für unsigned long, UBYTE für unsigned char, usw. das meine ich.
Das Flag ist laut MSDN ein UINT - also ein unsigned int vom Typ.

Was es alles für Präprozessorvariablen für Typen gibt kann ich nicht sagen - ich verwende die kaum (weil ich auch nicht so viel WinAPI programmiere).

Aber kuck mal in die MSDN da steht's sicherlich irgendwo.

Gruß
 
deepthroat hat gesagt.:
Wie gesagt, C-Strings sind nur Pointer - und wenn du den Pointer mit einem Integer vergleichst dann sagt das nichts über den String(-Inhalt) aus. Es wird nur festgestellt ob der übergebene Wert ein NULL-Pointer ist. FALSE ist eine Präprozessorvariable welche zu 0 evaluiert - was dem Wert eines Nullpointers entspricht.

Wie schon geschrieben bin ich AmiBlitz2 - Lastig, habe ich C noch kaum was gemacht von 2 Decodierungs Programmen, welche ein AmiBlitz2 - Spiel unterstützen mal abgesehen und das auch nur weil die Prog in C einfacher zu schreiben und womöglich auch schneller ausführbar waren. In AB2 gibt es 8 Variablen-Typen Byte (.b), Word (.w), Quick (.q) Long (.l) float (.f) double (.d) string (.s), man brauchte nicht zwischen signed und unsigned unterscheiden. z.B. String konnte man mit text.s oder text$ defineren, mann brauchte sich dabei auch nicht um eine Maxlänge zu kümmern. Pointer gibt es natürlich auch aber in AB2 wird extrem selten damit gearbeitet, fast alle Funktionen und befehle unterstützen keine Pointer, es sei den man greift direkt auf die OS und nicht auf die AB2-Befehle zurück, aber dann könnte man gleich in C proggen.

deepthroat hat gesagt.:
Wenn du auch prüfen willst, ob es sich bei dem übergebenen String um einen Leerstring handelt mußt du einfach nur das erste Zeichen überpfrüfen ob es gleich '\0' ist (ein Zeichen mit dem Code 0 bzw. NUL).

Das wollte ich schon mit pText[0] > 0 prüfen aber dann sagte der Compiler das es nicht fehlerfrei ist, ich darf kein [0] angeben weil es ein Pointer ist :confused: oder so ähnlich Naja ich werde es aber Trozdem nochmal probieren

deepthroat hat gesagt.:
Ich persönlich finde ja die ganzen Präprozessordefinitionen ganz schon lästig. Vor allem wenn die so irreführend bennant sind wie deine :) Naja, CSTR könnte "C-String" bedeuten oder aber "Constant String", allerdings ist der Typ gar kein String sondern nur ein einzelnes Zeichen! Müßte also eigentlich CCHAR heißen... Ich benutze dann lieber typedefs.

Ja das soll Constant String heissen :) Ich muss mich erst an die C-Variablen gewöhnen und das soll eine vereinfachung für mich sein. Ich kann mir z.B. FLAG besser merken als unsigened int, zumal ich dann auch immer wissen muss welche Art Variable für Flags da ist, so ersparre ich mir das :)

deepthroat hat gesagt.:
Das Flag ist laut MSDN ein UINT - also ein unsigned int vom Typ.

Was es alles für Präprozessorvariablen für Typen gibt kann ich nicht sagen - ich verwende die kaum (weil ich auch nicht so viel WinAPI programmiere).

Aber kuck mal in die MSDN da steht's sicherlich irgendwo.

Gruß

Nagut ich denke, das werde ich schon finden ... Ich will mich nach Möglichkeit gleich an diese Definitionen gewöhnen, die Tauchen garantiert dauert auf und dann muss ich nicht erst schauen von welchen Typ der ist und dann müste ich warscheinlich noch dauert einen Cast verwenden, was auch kein guter stil sein soll, habe ich mal gelesen
 
Cusco hat gesagt.:
Das wollte ich schon mit pText[0] > 0 prüfen aber dann sagte der Compiler das es nicht fehlerfrei ist, ich darf kein [0] angeben weil es ein Pointer ist :confused: oder so ähnlich Naja ich werde es aber Trozdem nochmal probieren
pText ist ein Pointer, da hat der Compiler Recht. Allerdings ist ein Array auch nur ein Pointer und mit dem Indexoperator auf den Index 0 zuzugreifen ist äquivalent zur Dereferenzierung des Pointers.
Code:
pText[i] == *(pText+i)    ==>    pText[0] == *pText
Du kannst im Grunde benutzen was du willst - vermutlich war das nur eine Warnung deines Compilers, denn normalerweise wird man in C kaum in irgendwas eingeschränkt - man muß nur wissen was man tut.

Warum benutzt du eigentlich den Borland Compiler? Also, ich meine schlecht ist er ja nicht, aber gibt es dafür einen besonderen Grund?

Gruß
 
Einen besonderen Grund gibt es eigentlich nicht, es stand nur auf einer Homepage das für eine WinAPI32 gleich alles dabei sein soll was man braucht, und ich hatte mir mal vor ca 2-4 Jahren schonmal einen Borland-Paket gesaugt, glaub eine 30Tage Demoversion Borland Builder oder so, zumindest auch ein C/C++ - Compiler, wollte mich damals schon damit auseinander setzen was ich aber bald wieder Aufgab. Bei diesen Click dir dein Programm zusammen sah ich einfach nicht durch und es kam mir auch viel zu umständlich vor. Kann jetzt aber sein das ich das mit "Visual C++ in 21 Tagen" welches ich ebenfalls Probierte verwechsel. Also wie gasagt war ich schon bei Borland bekannt und Angemeldet.

Heute ist schon das Buch "Windows-Programmierung" 5. Auflage (Sonderausgabe) vom Jahr 2000 angekommen, welches ich gestern morgen bei Amazon bestellte. Für die ersten Probleme damit (UNICODE) eröffne ich gleich ein Neues Thema, denn das hat nur indirekt was mit den Borland zu tun.
 
Cusco hat gesagt.:
Bei diesen Click dir dein Programm zusammen sah ich einfach nicht durch und es kam mir auch viel zu umständlich vor.

Naja das sind neue Dinge am Anfang doch immer. Im Prinip benötigt man nur wenige Stunden Einarbeitungszeit in die Borland GUI Umgebung. Dadurch kann man relativ schnell, wie du eben schon erwähnt hast sein Programm zusammenbasteln. Jedoch ist dies ja eben deshalb auch so gedacht.

Doch wenn du dir beispielsweise eine Checkbox in ein StrinGrid Zelle einfügen willst,musst du selbst rann und dich erst einmal durch den API Code von Borland durchwuseln.

Hat eben alles seine Vor- und Nachteile:)
 
Zurück