Avatar billede pablopablo Nybegynder
13. december 2004 - 04:51 Der er 35 kommentarer og
1 løsning

Fortsættelse af C++ projekt

Bertelbrander dette er ment til dig...:)

Hvis du kan lave programmet, således at man kan indsætte 3 stk gifs i stedet for de 3 knapper og at programmet bliver tjekket for div. fejltjek og at den IKKE skriver nogen besked ud hvis der opstår en fejl...ja så er endnu 200 points dine... ;)

Mvh. PabloPablo
Avatar billede bertelbrander Novice
13. december 2004 - 20:11 #1
gif's er et problem.
Windows har ikke indbygget support for gif. Så vidt jeg ved skal man købe en licens hvis man vil bruge gif's i sine programmer.

Der er ikke ret meget der kan fejle i programmet.
Du bør nok lave nogle check ved CreateProcess. Man kunne starte med at checke returværdien og bruge GetLastError til at finde eventuellefejl beskeder.
Jeg tvivler på at programmet kan provokeres til at lave fejl der resulterer i popup boxe.

Du bør naturligvis teste programmet på diverse versioner af windows.
Avatar billede pablopablo Nybegynder
14. december 2004 - 02:23 #2
jeg vil være super takkenemmelig hvis du kunne lave de fejltjek for mig...aner ikke hvad jeg skal skrive c++ er helt sort for mig...

Nej det regner jeg nu heller ikke med, men jeg vil blot være på den sikre side...
Avatar billede pablopablo Nybegynder
14. december 2004 - 04:40 #3
en lille ting...hvad skal jeg skrive for at formen bliver lukket ned igen, efter at man har trykket på den ønskede knap og den pågældende exe-fil er blevet kaldt...?
Avatar billede bertelbrander Novice
14. december 2004 - 20:18 #4
Du kan erstate linien med CreateProcess(...) med:

        if(!CreateProcess(0, ButtonInfo[id].ProgramName, 0, 0, 0, 0, 0, 0, &StartupInfo, &ProcessInformation))
        {
            char error_msg[2048];
            char *msg_buf;
            FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                          NULL,
                          GetLastError(),
                          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                          (char *)&msg_buf, 0, NULL);
            strcpy(error_msg, "Error executing program:\r\n");
            strcat(error_msg, ButtonInfo[id].ProgramName);
            strcat(error_msg, "\r\nWindows reports the following error:\r\n");
            strcat(error_msg, msg_buf);
            strcat(error_msg, "\r\nPlease contact your system administrator");
            MessageBox(hwndDlg, error_msg, "Whatever", MB_OK);
            LocalFree(msg_buf);
        }

Så vil den komme med en box hvis den fejler.

Med hensyn til andre fejlcheck: Hvis du kan provokere andre fejl i programmet skal jeg nok tilføje et check og/eller fixe fejlen.

Du kan afslutte programmet med en: PostQuitMessage(0);
Avatar billede pablopablo Nybegynder
14. december 2004 - 21:36 #5
nu er jo ikke C++ mand....men er det ikke muligt, at tjek for fejl/fange dem og lade programmet fortsætte...lade den køre videre i koden uden at brugeren opdager noget...det er klart, at det afhænger af hvilken typen fejl som opstår....

Hvilen type fejl fanger overstående kode...?

Jeg er kender stort set kun til java og c#/.net...og der er alt jo noget lettere at lave...der er det meget let at fange exceptions....
Avatar billede pablopablo Nybegynder
14. december 2004 - 21:39 #6
er der en måde jeg kan se hvorledes den messengebox med fejlmeddelsen ser ud? kan jeg gøre så den kommer frem...eller kan du sende et shot?...Blot så jeg lige kan rette den ordentlig til...
Avatar billede pablopablo Nybegynder
14. december 2004 - 21:53 #7
btw...det kode du hatr skrevet fanger da ikke selve fejlen vel....udskriver den ikke blot en besked på skærmen...hvad vil der ske hvis fejl opstår og jeg ikke har indsat overstående kode...?
Avatar billede pablopablo Nybegynder
14. december 2004 - 21:57 #8
glemte også at sprøge om hvor linien : PostQuitMessage(0); skal skrives før at det virker korrekt....
Avatar billede bertelbrander Novice
14. december 2004 - 22:08 #9
Der er ikke nogen af de funktioner der kaldes i programmet det laver exceptions. Man kan naturligvis checke returværdierne for alle de kaldte funktioner, men jeg tvivler meget på at de nogensinde fejler. Hvis der opstår en fejl vil programmet blot komme til at se forket ud (og i meget usansynlige tilfælde lukke ned).
En realistisk fremgangsmåde er at teste programmet grundigt og lukke de fejl der måtte opstå under test.

Koden ovenfor giver kun brugeren en besked hvis programmet ikke kan starte det valgte program. Hvis du vil se hvoran boxen ser ud, skriver du bare navnet på et eksisterende progam i ButtonInfo[id].ProgramName, og trykker på knappen.

Du putter kaldet til PostQuitMessage ind lige efter:

if(CreateProcess(...))
{
...
}
Avatar billede bertelbrander Novice
14. december 2004 - 22:10 #10
Jeg selv ville ikke være nevøs ved at sende programmet ud til 10 milioner brugere, efter nogle velvalgte tests.
Avatar billede pablopablo Nybegynder
14. december 2004 - 22:10 #11
Har lige opdaget en fejl...er det muligt, at gøre således at knapperne forbliver de samme steder på formen, ligegyldigt hvilken opløsning brugerens skærm kører med...har placeret de 3 knapper midt på formen med mere mellemrum imellem og der skulle de gerne blive...:)
Avatar billede bertelbrander Novice
14. december 2004 - 22:14 #12
Du bestemmer positionen af knapperne ved:
CreateWindow("BUTTON", .... 10 + 50*x, 50, 40, 40,

Du kan evt. håndtere WM_SIZE og så flytte dem der.
Brug GetClientRect(hwndDlg, &Rect); til at finde ud af hvor vinduet er og MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE +x), ... til at flytte dem.
Avatar billede pablopablo Nybegynder
14. december 2004 - 22:19 #13
jeg er med på hvordan jeg flytter dem manuelt...har som sagt hvor jeg gerne vil have de skal være...men de er ikke "Anchored" (sat fast på en bestemt plad på formen)...

Vinudet kører i fuldskærm....så labellen og de 3 knapper skal altid placeres ca. i middten af skærmen...kan du koden/et eks. til dette?
Avatar billede bertelbrander Novice
14. december 2004 - 22:30 #14
Man er nødt til at flytte dem manuelt.
Jeg laver lige et eksempel.
Avatar billede bertelbrander Novice
14. december 2004 - 22:43 #15
Tilføj følgende til switch'en:

  case WM_SIZE:
      {
        RECT Rect;
        GetClientRect(hwndDlg, &Rect);
        const int MidX = (Rect.right - Rect.left)/2;
        const int MidY = (Rect.bottom - Rect.top)/2;
        const int ButtonSize = 32 + 6;
        const int ButtonSpace = 10;
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 0), MidX - ButtonSize/2, MidY - ButtonSize - ButtonSpace - ButtonSize/2, ButtonSize, ButtonSize, TRUE);
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 1), MidX - ButtonSize/2, MidY - ButtonSize/2, ButtonSize, ButtonSize, TRUE);
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 2), MidX - ButtonSize/2, MidY + ButtonSpace + ButtonSize/2, ButtonSize, ButtonSize, TRUE);
      }
      break;
Avatar billede pablopablo Nybegynder
14. december 2004 - 22:51 #16
det er tæt på...de skal blot være på samme linie de 3 flag...og jeg skal kunne sætte størrelse på knapperne, således at jeg kan gøre dem breddere end de er høje...
Avatar billede pablopablo Nybegynder
14. december 2004 - 22:51 #17
de 3 flag = de 3 knapper ;)
Avatar billede pablopablo Nybegynder
14. december 2004 - 22:58 #18
jeg tror det er sådan her jeg gerne vil have det skal se ud :

case WM_SIZE:
      {
        RECT Rect;
        GetClientRect(hwndDlg, &Rect);
        const double MidX1 = (Rect.right - Rect.left)/3.5;
        const double MidX2 = (Rect.right - Rect.left)/2;
        const double MidX3 = (Rect.right - Rect.left)/1.4;
        const int MidY = (Rect.bottom - Rect.top)/2;
        const int ButtonSize = 85 + 6;
        const int ButtonSpace = 40;
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 0), MidX1 - ButtonSize/2, MidY - ButtonSize/2,, ButtonSize, ButtonSize, TRUE);
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 1), MidX2 - ButtonSize/2, MidY - ButtonSize/2, ButtonSize, ButtonSize, TRUE);
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 2), MidX3 - ButtonSize/2, MidY - ButtonSize/2,, ButtonSize, ButtonSize, TRUE);
      }
      break;

Men den brokker sig over tallene er af type double og ikke int...hvordan løser jeg dette?
Avatar billede bertelbrander Novice
14. december 2004 - 23:02 #19
Det er sansynligvis "kun" en warning.

const int MidX1 = int((Rect.right - Rect.left)/3.5);
Avatar billede bertelbrander Novice
14. december 2004 - 23:03 #20
Eller:

        RECT Rect;
        GetClientRect(hwndDlg, &Rect);
        const int MidX = (Rect.right - Rect.left)/2;
        const int MidY = (Rect.bottom - Rect.top)/2;
        const int ButtonSizeX = 64 + 6;
        const int ButtonSizeY = 32 + 6;
        const int ButtonSpace = 10;
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 0), MidX - ButtonSpace - ButtonSizeX - ButtonSizeX/2, MidY - ButtonSizeY/2, ButtonSizeX, ButtonSizeY, TRUE);
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 1), MidX - ButtonSizeX/2,                            MidY - ButtonSizeY/2, ButtonSizeX, ButtonSizeY, TRUE);
        MoveWindow(GetDlgItem(hwndDlg, IDC_EXECUTE + 2), MidX + ButtonSpace + ButtonSizeX/2,              MidY - ButtonSizeY/2, ButtonSizeX, ButtonSizeY, TRUE);
Avatar billede pablopablo Nybegynder
14. december 2004 - 23:18 #21
igen...det er tæt på...men hvordan får jeg lavet et mellemrum imellem de 3 knapper det skal være en 2-3 imellem dem...det kan jeg ikke lige se, uden at bruge kommatal...
Avatar billede bertelbrander Novice
14. december 2004 - 23:40 #22
I mit sidste eksempel er der ButtonSpace pixels mellem knapperne.
Jeg forstår ikke  "det skal være en 2-3 imellem dem".
Avatar billede pablopablo Nybegynder
14. december 2004 - 23:43 #23
sorry det er mig som stener....det er perfect!
Avatar billede bertelbrander Novice
14. december 2004 - 23:44 #24
Man kunne også lave ButtonSpace om til:

const int ButtonSpace = (Rect.right - Rect.left)/20;
Avatar billede pablopablo Nybegynder
14. december 2004 - 23:54 #25
hvad er forskellen?
Avatar billede pablopablo Nybegynder
15. december 2004 - 00:00 #26
hvordan får jeg fjernet labelen igen ....den laver sjove ting når jeg prøver...
Avatar billede bertelbrander Novice
15. december 2004 - 00:00 #27
Hvis du bruger sidste metode er afstanden mellem knapperne bestemt af bredden på vinduet, hvilket gør at de bliver mere jævnt fordelt ved forskellige bredder.
Avatar billede pablopablo Nybegynder
15. december 2004 - 00:04 #28
hvordan får jeg fjernet labelen igen ....den laver sjove ting når jeg prøver...
Avatar billede bertelbrander Novice
15. december 2004 - 00:04 #29
Du mangler sikkert at fjerne linien:
InvalidateRect(GetDlgItem(hwndDlg, IDC_LABEL), 0, TRUE);

(Slet alle linier hvor IDC_LABEL indgår.)
Avatar billede pablopablo Nybegynder
15. december 2004 - 00:05 #30
hov....skærmen begynder at blinke helt vildt når jeg slette label linien...??
Avatar billede pablopablo Nybegynder
15. december 2004 - 00:05 #31
ok..prøver lige..
Avatar billede pablopablo Nybegynder
15. december 2004 - 00:10 #32
bingo....det eneste der så er ....at baggrundsbillede bliver ikke så pænt hvis man køre med en relativ høj opløsnin....fx. 1600 x 1200....det billede jeg har indsat er nemlig kun 800 x 600....men jeg kan jo ikke rigtig lave det større idet kun en del af det vil blive vist, hvis brugeren kører en lavere opløsning...
Avatar billede bertelbrander Novice
15. december 2004 - 00:22 #33
Billedet skulle gerne tilpasse sig størrelesen på vinduet.
Du kan evt have lave flere billeder til forskellige opløsninger.
Avatar billede pablopablo Nybegynder
15. december 2004 - 15:59 #34
ja det gør det...men opløsningen bliver jo ik så pæn på alle skærme idet det er fuldskærm...men...nu har bare lavet formen mindre - den behøves nemlig at køre i fuldskærm...så nu er den bare fin!!

Nu kan jeg vist ikke finde på mere at spørge om...:) læg et svar og få dine velfortjente points!! Det er super at du har ville hjælpe mig SÅ meget...HVIS jeg finder en fejl i programmet, håber jeg at du hjælpe mig med det - men det bliver jo nok ikke aktuelt - Go' JUL ;))

Mvh. PabloPablo
Avatar billede bertelbrander Novice
15. december 2004 - 19:16 #35
Jeg samler ikke på point. Du må gerne selv lave et svar så du kan få dine point tilbage og spørgsmålet kan blive lukket.

Jeg er sikker på at du kan få hjælp fra en eller anden her på eksperten hvis du skulle få problemer med programmet.
Avatar billede pablopablo Nybegynder
18. december 2004 - 02:17 #36
Jamen, mange tak for det da! Jeg stiller nemlig ofte spg...såå det vil aldrig skade mig...tak igen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester