Avatar billede quiw Nybegynder
04. maj 2006 - 08:34 Der er 13 kommentarer og
1 løsning

Projekt Ordbog

Mig og en ven er ved at programmere en ordbog til et skoleprojekt, og vi er sådan set færdige .. Har har koden her:
#include <iostream>

#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>

using namespace std;
      char word[1024];
      char outconstr[1024]; // Returned connection string
      int outconlen; // Length of returned connection string
      char sqlstr[200]; // Insert
      char *constr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=users.mdb;Uid=Admin;Pwd=";
      char s[50];
      char user[50];
      char password[50];
      int sl;
      bool online = true;
      SQLHENV Environment; //ODBC enviroment
      SQLHDBC DataBaseConnect; //ODBC Connection
      SQLHSTMT stmt; //ODBC Statement
      SQLRETURN stat; //ODBC Return status
     
void startdatabase()
{
      stat = SQLAllocEnv(&Environment);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocEnv\n");
      }
      stat = SQLAllocConnect(Environment,&DataBaseConnect);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocConnect\n");
      }
      stat = SQLDriverConnect(DataBaseConnect,NULL,
                              (SQLCHAR *)constr,(SQLSMALLINT)strlen(constr),
                              (SQLCHAR *)outconstr, (SQLSMALLINT)sizeof(outconstr),
                              (SQLSMALLINT *)&outconlen,SQL_DRIVER_COMPLETE);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in Connect\n");
      }
      stat = SQLAllocStmt(DataBaseConnect,&stmt);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in AllocStmt\n");
      }
}

void readfromdb()
{
      // READ DATA FROM DATABASE
      sprintf(sqlstr,"SELECT password FROM info WHERE user = ('%s')",word);
      stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in Read \n");
      }
      stat = SQLBindCol(stmt,1,SQL_C_CHAR,s,sizeof(s),(SQLINTEGER *)&sl);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error in BindCol\n");
      }
      for(;;)
      {
            stat = SQLFetch(stmt);
            if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) break;
            s[sl] = '\0';
      }
}

void deleteindb()
{
      // DELETE IN DATABASE
      sprintf(sqlstr,"DELETE from tabel WHERE id = 4");
      stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
      {
            printf("Error, could not delete in database. \n");
      }
}

void shutdowndb()
{
      SQLFreeStmt(stmt,SQL_DROP);
      SQLDisconnect(DataBaseConnect);
      SQLFreeConnect(DataBaseConnect);
      SQLFreeEnv(Environment);
}
int main()
{     
      while(online=true)
      {
      startdatabase();
      cout << "Enter a word: \n";
      cin >> word;
      readfromdb();
      cout << "Results: "<<s<<"\n";
      shutdowndb();
      }
      system("pause");
      return 0;
}

- Men vores problem er, at det kun er konsol baseret og vi har ikke nok tid til at sætte os ind i at lave et grafisk vindue .. Så vi ville høre, om der var nogle som kunne smide noget hurtigt sammen for os, så det ser lidt ud som denne: http://hotel.eucnord.net/dc69217/applikation.jpg
- Hvor den altså udskriver resultatet ..
Avatar billede bertelbrander Novice
04. maj 2006 - 23:18 #1
Læs lidt af:
http://home20.inet.tele.dk/midgaard/dialogtut.html

Og brug 15 minutter på at skrive koden, så skulle den være hjemme.

Kan I ikke få det til at virke, så post den del I kan få til at virke så fortsætter vi derfra.
Avatar billede quiw Nybegynder
08. maj 2006 - 13:00 #2
Bertel - Det er en meget god tutorial :)
Men .. Er kommet frem med denne kode her:

#include <windows.h>
#include <iostream>
enum WindowsId
{
  FirstEditId = 256,
  SecondEditId,
  ResultEditId,
  ButtonId
};

using namespace std;

HINSTANCE InstanceHandle;
int NumPush = 0;

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_CREATE:
      CreateWindowEx(WS_EX_CLIENTEDGE,
                    "EDIT",
                    "Enter search", // Initial Text
                    WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP,  // Style
                    5, 5, 120, 20, // position
                    hwndDlg, // Owner
                    (HMENU)(FirstEditId), // ID
                    InstanceHandle,  // The application
                    0);

      CreateWindowEx(WS_EX_CLIENTEDGE,
                    "EDIT",
                    "Oh Really?", // Initial Text
                    WS_CHILD | WS_VISIBLE | ES_READONLY,  // Style
                    5, 65, 120, 20, // position
                    hwndDlg, // Owner
                    (HMENU)(ResultEditId), // ID
                    InstanceHandle,  // The application
                    0);

      CreateWindow("BUTTON",
                  "Search",                        // Button Text
                  WS_CHILD | WS_VISIBLE | WS_TABSTOP,  // Style
                  5, 90, 120, 30, // position
                  hwndDlg, // Owner
                  (HMENU)(ButtonId), // ID
                  InstanceHandle,  // The application
                  0);

      break;
  case WM_COMMAND:
      if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ButtonId)
      {
        char First;
        char Result;
        First = GetDlgItemInt(hwndDlg, FirstEditId, 0, FALSE);
        Result = First;
        SetDlgItemInt(hwndDlg, ResultEditId, Result, FALSE);
      }
      break;
  }
  return DefWindowProc(hwndDlg, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, INT nCmdShow)
{
  InstanceHandle = hInstance;

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  HWND WindowHandle = CreateWindow("WhateverClass",
                                    "Database loader", // Caption text
                                    WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS |
                                    WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                                    100, 100, 140, 160,  // Position
                                    NULL,
                                    NULL,
                                    InstanceHandle,
                                    0);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}


Problemet ligger bare i:

        char First;
        char Result;
        First = GetDlgItemInt(hwndDlg, FirstEditId, 0, FALSE);
        Result = First;
        SetDlgItemInt(hwndDlg, ResultEditId, Result, FALSE);

Jeg kan ikke få den til at arbejde med chars .. Når jeg indtaster et bogstav returnere den bare 0 .. Og vil egentlig gerne have at den returnere f.eks. input "Hejsa med dig" ... Så vil den returnere "Hejsa med dig" i feltet ...  Kan det lade sig gøre?
Avatar billede bertelbrander Novice
08. maj 2006 - 18:36 #3
GetDlgItemInt og SetDlgItemInt arbejder med int (heltal).

Du vil gerne arbejde med strenge, så må du bruge GetDlgItemText og SetDlgItemText.

Det kan se sådan ud:
  case WM_COMMAND:
      if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ButtonId)
      {
        char Buffer[1024];
        GetDlgItemText(hwndDlg, FirstEditId, Buffer, sizeof(Buffer));
        SetDlgItemText(hwndDlg, ResultEditId, Buffer);
      }
      break;
Avatar billede quiw Nybegynder
08. maj 2006 - 21:11 #4
Doh .. Hvorfor lære jeg ikke at læse ordenligt .. Kunne jeg faktisk ha sagt mig selv .. Men mange tak .. Har faktisk fået en del ud af det her :)

- Men må bede dig om endnu en ting, skal nok love det bliver den sidste, men .. Hvis jeg gerne vil have outputtet som f.eks. text .. Hvordan kan jeg det?.. Hvilket objekt skal jeg bruge?.. Og kan jeg tilføje et XP style look?
Avatar billede quiw Nybegynder
08. maj 2006 - 21:39 #5
Har fixet det med XP Look, fra din hjemmeside :)
Men kan man gøre programmet og manifest filen til 1 program?
Avatar billede bertelbrander Novice
08. maj 2006 - 21:54 #6
Jeg er ikke sikker på at jeg forstår: "Hvis jeg gerne vil have outputtet som f.eks. text"

Buffer, fra mit sidste eksempel, indeholder teksten, du kan oprette en std::string ud fra den:

std::string Text:

        char Buffer[1024];
        GetDlgItemText(hwndDlg, FirstEditId, Buffer, sizeof(Buffer));
        Text = Buffer;

Jeg tror godt at man kan lave manifest filen som en del af programmet, med nogle compilere, men jeg ved ikke hvordan, prøver lige at undersøge.
Avatar billede quiw Nybegynder
08. maj 2006 - 22:05 #7
Du havde ret, det var indbygget i compilleren (Dev-cpp) .. Man kunne sætte flueben i XP style, men .. Jeg mener tekst som f.eks. dette:
http://frip.dk/quiw/billede.JPG

- Markeret med rødt.
- Jeg vil gerne have sådan, at jeg kan udskrive f.eks. min "Char buffer" på samme måde ..
Avatar billede quiw Nybegynder
08. maj 2006 - 22:06 #8
Må lige definere, det som ER markeret med rødt .. Det skal IKKE markeres med rødt i midt program .. Bare ganske almindeligt som f.eks. Balance, lydstyrke og sådan som på billedet.
Avatar billede bertelbrander Novice
08. maj 2006 - 22:10 #9
Hvis du opretter ResultEditId som en "static" med:

      CreateWindow("STATIC",
                  "Oh Really?", // Initial Text
                  WS_CHILD | WS_VISIBLE,  // Style
                  5, 65, 120, 20, // position
                  hwndDlg, // Owner
                  (HMENU)(ResultEditId), // ID
                  InstanceHandle,  // The application
                  0);

Kommer det til at se ud på den måde.
Avatar billede quiw Nybegynder
08. maj 2006 - 22:15 #10
Windows API'et er da ikke så svært alligevel, det var ellers det som havde skræmt mig fra at forsøge i langtid.. Men du skal have mange tak.

- Har præcis hvad jeg skal bruge .. Vil du smide et svar? :)
Avatar billede bertelbrander Novice
08. maj 2006 - 22:38 #11
Rygtet om Win32Api'ets utilgængelighed er overdrevet.

Jeg samler ikke på point.
Avatar billede quiw Nybegynder
08. maj 2006 - 22:46 #12
Okay, har hørt .NET skulle være nemmere at arbejde med, men der har man åbenbart ikke den frihed som med C++..
Som jeg har forstået, er C++ simpelthen den absolutte grundkode, altså foruden rå maskinkode. Næsten alt er programmeret af C++ .. Windows, Linux osv.. Eller har jeg misforstået noget?
Avatar billede bertelbrander Novice
08. maj 2006 - 22:52 #13
.net er nok nemmere at lave GUI i, har ikke selv prøvet.

I C++ har man nogle friheder som man ikke har i .net, det kan være en fordel, men det kan også være en ulempe.

Det meste af Windows og Linux core er skrevet i C, med noget C++.
Avatar billede quiw Nybegynder
11. maj 2006 - 22:31 #14
Okay, men mange tak for hjælpen.
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