Gå til innhold

Bruk av string ved FLTK


Anbefalte innlegg

Skrevet

Hvorfor funker ikke dette?

 

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Button.H>

char stringIn[100];

void cb_string(Fl_Widget *o, void*) {
    Fl_Input *input = (Fl_Input *) o;
    input->value(stringIn);
    
    Fl_Window *window = new Fl_Window(300, 200);
    window->label(stringIn);
    
    window->end();
    window->show();
    }

int main (int argc, char *argv[])
{
   Fl_Window *mainWindow = new Fl_Window(400, 300, "Program");
   Fl_Input *input = new Fl_Input(100, 30, 100, 25, "Input");
   Fl_Button *button = new Fl_Button(100, 80, 50, 25, "Button");
   
   button->callback(cb_string);
   
   mainWindow->end();
   mainWindow->show(argc, argv);

   return Fl::run();
}

 

Det skjer ingenting med det nye vinduet jeg lager. Labelen forandrer seg ikke. Hvorfor!?

Videoannonse
Annonse
Skrevet

Først av alt:

- Du skriver C++. Bruk std::string. Det er lettere, sikrere og i enkelte tilfeller raskere.

- Lær deg til å bruke C++-kasting.

- Unngå globale variabler.

 

 

Vindustittelen blir satt, men den blir ikke satt til det du ønsker at den skal bli satt til. Hvorfor ikke? Fordi du aldri henter verdien til Fl_Input-en din inn i stringIn. stringIn er dermed tom når du kaller window->label(stringIn);.

Skrevet

Kan jeg bruke en peker til å peke i minnet til der stringen ligger, eller er det feil ved passeringen til callback funksjonen?

Skrevet (endret)

Har klart og lagre teksten i en streng på denne måten

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Button.H>
#include <string>
using std::string;

void cb_button(Fl_Widget* , void *inp) {
    string szIn;
    szIn = static_cast <Fl_Input*> (inp)->value();
    }

int
main (int argc, char *argv[])
{
   Fl_Window *window = new Fl_Window(300, 200);
   Fl_Input *input = new Fl_Input(50, 10, 100, 25, "In: ");
   Fl_Button *button = new Fl_Button(100, 50, 60, 25, "Button");
   
   button->callback(cb_button, input);
   
   window->end();
   window->show(argc, argv);

   return Fl::run();
}

 

Noen andre / bedre måter og gjøre det samme på?

Endret av Kjeksen
Skrevet (endret)

Noen som kan gi meg et eksempel på og sende flere ( 3 ) inputer til en callback funksjon? får error når jeg gjør slik AddButton->callback(cb_AddContact, firstname, lastname, number);

 

firstname, lastname og number er input`ene

Endret av Kjeksen
Skrevet

Ingen som har en anelse? trenger VIRKELIG hjelp på denne :hmm:

 

Prøvde og løse det med å bruke 3 callbacker til samme knappen. Det funket, bare at når jeg skrev til text fila så skrev den over det forrige. Selv om jeg har gjort sånn at den skal skrive på enden og ikke over. Så den metoden funket ikke.

 

SITTER BOM FAST! :no:

Skrevet

Du kan sikkert lage en klasse(?)..

struct Contact {
std::string firstname, lastname;
unsigned int number;
};

eller noe, og så sende den som et argument istedenfor firstname, lastname og number.

Skrevet (endret)

Jeg vet ikke helt hva du vil her, men hvorfor sender du ikke bare med en peker til en container/array? Evt. bruke en struct.

 

edit: for sen

Endret av drall
Skrevet (endret)

Saken her er at jeg har 3 inputer. Jeg tenkte jeg skulle sende inputene til en funksjon, deretter få verdiene til forskjellige stringer. Eksempel

 


Fl_Input *FirstnameInput = new Fl_Input(10, 100, 200, 25, "Firstname");
Fl_Input *LastnameInput = new Fl_Input (10, 200, 200, 25, "Lastname");
Fl_Input *NumberInput =  new Fl_Input(10, 300, 200, 25, "Number");

Fl_Button *AddButton = new Fl_Button(100, 350, 100, 40, "Add Contact");


//Deretter sende inputene til 1 funksjon
AddButton->callback(cb_addcontact, FirsnameInput, LastnameInput, NumberInput);

 

Dette funker ikke. Det jeg mener jeg kan gjøre er og lage en klasse med Fl_Inputer. Og deretter passere objektet av denne(?)

Endret av Kjeksen
Skrevet (endret)

Tror jeg skjønner hva du mener. Husker ikke helt hvordan man henter fram inputen, men hvis du bare gjør det, så burde det være en smal sak å legge til dette i en container eller noe, som drall nevnte:

vector<string> contact;
contact.push_back(FirstnameInput->value());  //husker som sagt ikke om dette er den riktige funksjonen
contact.push_back(LastnameInput->value());  //Som ovenfor..
contact.push_back(NumberInput->value());     //------"---------

Skal se om jeg ikke finner ut hva man må gjøre for å hente inputen..

 

Edit: Det var Fl_Input::value() funksjonen het ja. *endre på*

Endret av zirener
Skrevet
Saken her er at jeg har 3 inputer. Jeg tenkte jeg skulle sende inputene til en funksjon, deretter få verdiene til forskjellige stringer. Eksempel

 

Fl_Input *FirstnameInput = new Fl_Input(10, 100, 200, 25, "Firstname");
Fl_Input *LastnameInput = (10, 200, 200, 25, "Lastname");
Fl_Input *NumberInput = (10, 300, 200, 25, "Number");

Fl_Button *AddButton = new Fl_Button(100, 350, 100, 40, "Add Contact");


//Deretter sende inputene til 1 funksjon
AddButton->callback(cb_addcontact, FirsnameInput, LastnameInput, NumberInput);

 

Dette funker ikke. Det jeg mener jeg kan gjøre er og lage en klasse med Fl_Inputer. Og deretter passere objektet av denne(?)

struct Contact {
    std::string first_name, family_name;
    int number;
};

void f()
{
    Fl_Input* first_name = new Fl_Input(10, 100, 200, 25, "First name");
    // Du hadde glemt 'new Fl_Input' på disse to:
    Fl_Input* family_name = new Fl_Input(10, 200, 200, 25, "Family name");
    Fl_Input* number = new Fl_Input(10, 300, 200, 25, "Number");

    Fl_Button* add = new Fl_Button(100, 350, 100, 40, "Add contact");

    Contact c = { first_name.value(), family_name.value(), number.value() };

   add->callback(cb_addcontact, c);
}

 

Alternativt

vector<Fl_Input*> contacts;
contacts.push_back(first_name);
contacts.push_back(family_name);
contacts.push_back(number);

 

Alternativt

Slik som zirener viser, men med Fl_Input::value(), som funksjonen heter.

Skrevet
struct Contact {
    std::string first_name, family_name;
    int number;
};

void f()
{
    Fl_Input* first_name = new Fl_Input(10, 100, 200, 25, "First name");
    // Du hadde glemt 'new Fl_Input' på disse to:
    Fl_Input* family_name = new Fl_Input(10, 200, 200, 25, "Family name");
    Fl_Input* number = new Fl_Input(10, 300, 200, 25, "Number");

    Fl_Button* add = new Fl_Button(100, 350, 100, 40, "Add contact");

    Contact c = { first_name.value(), family_name.value(), number.value() };

   add->callback(cb_addcontact, c);
}

Dette virket ikke helt som det skulle. Får beskjed om: 'value' has not been declared :hmm:

Skrevet (endret)

Akkurat den koden..

Kan paste den koden jeg har brukt så dere få se.

 

struct Contacts{
      std::string Firstname, Lastname;
      int Number;
      };

void cb_AddContact() {
    //Window
    Fl_Window *AddContactWindow = new Fl_Window(400, 300, "Add contact");
    
    //Inputs
    Fl_Input *FirstnameInput = new Fl_Input(80, 40, 200, 25, "Firstname: ");
    Fl_Input *LastnameInput = new Fl_Input(80, 80, 200, 25, "Lastname: ");
    Fl_Input *Number        = new Fl_Input(80, 120, 200, 25, "Number: ");
    
    //Buttons
    Fl_Button *AddButton = new Fl_Button(100, 200, 100, 30, "Add contact");
    Fl_Button *OkButton = new Fl_Button(220, 200, 50, 30, "Ok");
    
    
    Contacts contact = { FirstnameInput.value(), LastnameInput.value(), Number.value() };
    
    //Callbacks
    AddButton->callback(cb_AddContact, contact);
}

void cb_AddContact(Fl_Widget *x, void *inp) {
//osv
}

 

 

Feilmeldingene:

 

67 C:\Dev-Cpp\FLTKphonebook.cpp `value' has not been declared

67 C:\Dev-Cpp\FLTKphonebook.cpp request for member of non-aggregate type before '(' token

67 C:\Dev-Cpp\FLTKphonebook.cpp `Firstname' undeclared (first use this function)

 

Mye feil på linje 67 :blush:

Endret av Kjeksen
Skrevet

Signaturen er const char *Fl_Input::value() const, så det er ikke der feilen ligger.

 

Det høres mer ut som at du blander Firstname og FirstnameInput, men jeg ser ikke noe galt i det du har postet. Se over koden din en gang til, du.

 

For øvrig tror jeg ikke du vil overlaste cb_AddContact() på den måten -- funksjonene virker mer relaterte enn de egentlig er.

Skrevet

Har gjort det flere ganger, men ser ingen spesielle feil jeg heller. Tror ikke jeg blander Firstname og FirstnameInput osv. Får fremdeles beskjed om samme feilene..

Skrevet

Her er det meste av koden.

 


#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Button.H>
#include <string>

struct Contact{
      std::string Firstname, Lastname;
      int number;
      };


//Function declarations
void cb_AddWindow(Fl_Widget *x, void*);
void cb_AddContact(Fl_Widget *x, void *inp);


int main (int argc, char *argv[])
{
  //MainWindow 
  Fl_Window *MainWindow = new Fl_Window(300, 200, "PhoneBook");

  //Buttons
  Fl_Button *AddButton = new Fl_Button(20, 70, 100, 30, "Add Contact");
  Fl_Button *GetButton = new Fl_Button(170, 70, 100, 30, "Get Contact");
  Fl_Button *QuitButton = new Fl_Button(110, 150, 70, 30, "Quit");
  
  //Callback
  AddButton->callback(cb_AddWindow);
  
  
  MainWindow->end();
  MainWindow->show(argc, argv);
  
  
   return Fl::run();
}


//Add Contact Window
void cb_AddWindow(Fl_Widget *x, void*) {
    
    //AddContact Window
    Fl_Window *AddContactWindow = new Fl_Window(400, 300, "Add Contact");
    
    //Inputs
    Fl_Input *FirstnameInput = new Fl_Input(100, 50, 250, 25, "Firstname: ");
    Fl_Input *LastnameInput = new Fl_Input(100, 100, 250, 25, "Lastname: ");
    Fl_Input *NumberInput = new Fl_Input(100, 150, 250, 25, "Number: ");
    
    //Buttons
    Fl_Button *AddButton = new Fl_Button(100, 250, 100, 30, "Add Contact");
    Fl_Button *OkButton = new Fl_Button(250, 250, 70, 30, "Ok");
    
   Contact c = { FirstnameInput.value(), LastnameInput.value(), NumberInput.value() };
    
    //Callbacks
    AddButton->callback(cb_AddContact, c);
    
    AddContactWindow->end();
    AddContactWindow->show();
    }


void cb_AddContact(Fl_Widget *x, void *inp) {
    //kode kode
    }

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...