Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.01.2007, 19:52

API: Editbox will nicht!

Hallo.
Ich habe ein kleines Problem.
Ich schreibe gerade ein einfaches Programm um eine datei zu öffnen und das Programm soll diese dann einfach in einer editbox ausgeben.
Doch da ist ein komisches problem.
Das Programm kann erfolgreich kompliert werden doch wenn man es öffnet und mit der maus drüber geht schmiert es ab :(
Hier mal der code:

C-/C++-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
36
37
38
39
40
41
42
43
44
45
46
47
char *openFile(char *filename){

HANDLE hFile;

hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//Groesse ermitteln

DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
//Speicher freigeben

char *pbSpeicher;
pbSpeicher = pbSpeicher;
pbSpeicher[dwFileSize] = 0;
//Lesen

DWORD dwFileRead;
ReadFile(hFile, pbSpeicher, dwFileSize, &dwFileRead, NULL);

return pbSpeicher;

free(pbSpeicher);
CloseHandle(hFile);
     
}


void Textmode( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    
switch(message)
    {
    case WM_CREATE:
         static HWND hEdit;
          char *buffer=openFile("hallo.txt");
                   hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
                                   "edit",
                                   buffer,    // <- das ist der Inhalt der Editfelds

                                   WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
                                              ES_AUTOVSCROLL,
                                   0, 0, 595, 428,
                                   hWnd,
                                   NULL,
                                   ((LPCREATESTRUCT) lParam) -> hInstance,
                                   NULL);

            free(buffer);
            break;
            
            }
}

Was ist das problem?
Gruß flo

2

02.01.2007, 22:22

Re: API: Editbox will nicht!

.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FOGX« (15.09.2010, 16:14)


koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

3

03.01.2007, 00:01

C-/C++-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
HANDLE hFile;

// -> s.o.

hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


//Groesse ermitteln

// -> wozu?

DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);

//Speicher freigeben

// -> welchen Speicher denn freigeben? du erstellst hier einen Zeiger auf char's !

char *pbSpeicher;

// -> s.o. sinnos

pbSpeicher = pbSpeicher;

// -> Wasn das? Du musst erst Speicher anfordern! (new, malloc) - was aber hier auch ein Fehler wäre, dazu näheres Später...

pbSpeicher[dwFileSize] = 0;

//Lesen

DWORD dwFileRead;
ReadFile(hFile, pbSpeicher, dwFileSize, &dwFileRead, NULL);

// -> s.o.

return pbSpeicher;

// -> s.o.

free(pbSpeicher);

//-> vor return !

CloseHandle(hFile);



Irgendwie verwirrend ^^.

Ich vermute mal du willst den Text aus einer Datei lesen. Dann kannst du das auf zwei Arten machen. Dynamisch, mit new & delete (was aber kack ist, den wo sollst du das freigeben?) oder einfach Statisch. Das heisst du sagst einfach: char pbSpeicher[256]; Also deine Datei darf 256 Chars haben.

Für eigentlich alle Zwecke ist sowas voll ausreichend.

Wenn du wirklich alle auslesen willst, würd ich einfach nen String aus der STL nehmen und die chars immer nacheinander einfügen (anhänngen). Alternativ kannst du dir auch ne eigene Container Klasse schreiben wie sowas:

C-/C++-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
36
37
38
39
40
41
42
43
44
class Container
{
private:
  char* pContainer;
  unsigned seq;
  unsigned size;
public:
  Container() : pContainer(NULL), size(0), seq(0) {}
  ~Container() { if(pContainer) delete[] pContainer; size=0; seq=0; }

  void Add(char a) 
  {
    // Wenn Sequenz länger...

    if(seq+1 >= size) 
    {
        // Tempöräre Var.

        char* pTmp = NULL;

        // Wenn was im Container drin is...

        if(pContainer)
        {
            // Temp füllen mit Inhalt 

            pTmp = new char [size];
            memcpy(pTmp, pContainer, size-1);

            // Container größer machen

            delete[] pContainer;
        }
        // Um 3 größer machen

        pContainer = new char [size+=32];

        // Wenn Tmp noch vorhanden ....

        if(pTmp)
        {
            // Die alte Größe (size - 32) kopieren

            memcpy(pContainer, pTmp, size-(32+1));
            delete[] pTmp;
        }
    }
    // Char zuweisen, 0 setzen.

    pContainer[seq] = a; pContainer[++seq] = 0; 
  }
  inline char* Get(void)  { return pContainer; }
};


verwendet...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
Container A;

A.Add('a');
A.Add('b');
A.Add('c');
A.Add('d');
A.Add('e');
A.Add('f');

MessageBoxA(NULL, A.Get(), "Msg", MB_OK);

Werbeanzeige