Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 kwi 2024, o 02:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 4 lut 2015, o 17:56 
Offline
Użytkownik

Dołączył(a): 31 sie 2014
Posty: 135
Lokalizacja: Racibórz (okolice)
Pomógł: 0

Witam szanowne koleżanki i kolegów!

Mam sobie projekt malutki w Builder C++, który ma opierać się na gotowcu napisanym w C...
Na formie mam komponent MEMO i chciałbym w nim wyświetlać komunikaty, które w oryginalnym kodzie są wyświetlane w konsoli poprzez printf():

Kod:
void lcd_set(unsigned char cmd, int value) {
  if(usb_control_msg(handle,
        USB_TYPE_VENDOR, cmd, value, 0,
        NULL, 0, 1000) < 0) {
    printf(stderr, "USB request failed!");
  }
}


Jeśli zamiast printf wpiszę Memo1->Lines->Add to dostaję błąd Undefinied Symbol 'Memo1'.

Jak można to przerobić żeby można było do memo wpisywać to co printf wyświetla w konsoli?

BC++ jest podobny do Delphi tylko z wyglądu, widzę, że wiele rzeczy jest inaczej zrobionych, chociaż same VCL są identyczne.... W Delphinku po prostu zadeklarowałbym sobie jakąś funkcję, a tutaj niby ona już jest, ale nie chce współpracować.
Ps. wiem, za mało chlebka zjadłem jeśli chodzi o C.
Ps2 proszę o wędkę a nie o rybkę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 18:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 maja 2014
Posty: 317
Pomógł: 19

Hmm.. Nie wychodzi Tobie takie coś?

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdrawiam! j23 Jarek

_________________
"O sygnałach bez całek" Czesław Frąc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 18:30 
Offline
Użytkownik

Dołączył(a): 31 sie 2014
Posty: 135
Lokalizacja: Racibórz (okolice)
Pomógł: 0

No właśnie nie. Zupełnie jakby nie wiedział co to jest Memo1...
Ale jak wpiszę to w zdarzenie onclick buttona to już wtedy rozpoznaje Memo...

Chyba nie ma znaczenia w którym miejscu w kodzie (czy w zdarzeniu obiektu czy w procedurce C) odwołuję się do komponentu, skoro przecież jest poprawnie utworzony (przeciągnięty na formularz)???



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 18:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 maja 2014
Posty: 317
Pomógł: 19

Nie ma znaczenia w którym miejscu odwołujesz się do komponentu, ale zmienna obiektowa Memo musi zostać przekazana do funkcji, jeśli to Memo jest wywoływane z jakiejś tam funkcji.

Hmm... Pokaż przykład jak chcesz użyć Memo. Wklej ten kod, bo tu co podałeś tego nie widać.
Acha.. Na formularzu masz to Memo umieszczone, tak?

Pozdrawiam! j23 Jarek

------------------------ [ Dodano po: 8 minutach ]

Jeszcze taka sprawa..
Jeśli odwołujesz się do Memo z jakiejś tam zewnętrznej (tzn. swojej własnej funkcji) to ta funkcja powinna wyglądać tak:

Plik nagłówkowy (*.h):
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Plik źródłowy (*.cpp):
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pozdrawiam! j23 Jarek


Autor postu otrzymał pochwałę

_________________
"O sygnałach bez całek" Czesław Frąc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 19:00 
Offline
Użytkownik

Dołączył(a): 31 sie 2014
Posty: 135
Lokalizacja: Racibórz (okolice)
Pomógł: 0

tak, na formie mam memo1 i button'a.

W onclick button'a wszystko jest OK, ale jak mam coś takiego:

Kod:
#include <vcl.h>
#include <iostream>
#pragma hdrstop
#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

#include <stdio.h>
...

void lcd_get_keys(void) {
  int keymask = lcd_get(LCD_GET_KEYS);

  if(keymask != -1)
    printf("Keys: 0:%s 1:%s\n",
      (keymask&1)?"on":"off",
      (keymask&2)?"on":"off");
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
... <- Tutaj wszystko działa OK, czyli Memo1->Lines->Add("cośtam");
}

}


i chcąc zamienić printf("Keys....."); na Memo1->Lines->Add("Keys..."); czyli:

Kod:
void lcd_get_keys(void) {
  int keymask = lcd_get(LCD_GET_KEYS);

  if(keymask != -1)
    Memo1->Lines->Add("Keys: 0:%s 1:%s\n",
      (keymask&1)?"on":"off",
      (keymask&2)?"on":"off");
}


dostaję błąd:
Kod:
[C++ Error] Unit1.cpp(245): E2451 Undefined symbol 'Memo1'


W sumie, próbując w tej procedurce dopisać w Memo1 powoduje wystąpienie błędu.

Wiem, mieszam, ale nie wiem jak to inaczej prościej napisać/opisać/przedstawić ;/

------------------------ [ Dodano po: 15 minutach ]

Dobra, mam już :D

Skoro nie mogę w funkcji wpisać nic do Memo, to mogę zwrócić jej wynik poprzez return.
A samą funkcję można wywołać poprzez Memo1->Lines->Add(nazwa_funkcji());

I to mi zadziałało.

Edit2: Na pewno wykorzystam Twoje wskazówki. Dzięki! :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 19:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 maja 2014
Posty: 317
Pomógł: 19

Hmm...

Po pierwsze tak:
Tam w Bcb masz okienko object inspector i dalej zakładka events. Jak zaznaczysz komponent Memo i przejdziesz na zakładkę events to wtedy pojawią Ci się w object inspectorze różne funkcje składowe (właściwie są to zdarzenia) jakie mogą wystąpić w Memo.
Są tam m.in. takie zdarzenia (events):
- OnKeyUp -> gdy klawisz zostanie podniesiony ze stanu wciśniętego
- OnKeyPress -> gdy klawisz zostanie wciśnięty i puszczony
- OnKeyDown -> gdy klawisz zostanie wciśnięty i jest trzymany

Acha.. No i klikając dwa razy na któreś ze zdarzeń dodajesz sobie funkcję, która będzie się uaktywniała, gdy np. wciśniesz klawisz chcąc coś wpisać do Memo (wtedy będzie to zdarzenie OnKeyDown). Po dwukrotnym kliknięciu masz już tą funkcję w pliku źródłowym, no i wpisujesz w jej ciało co ona ma dokładnie robić, co ma przetwarzać, itd. To znaczy po kliknięciu dwa razy w zakładce events na np. OnKeyDown powinieneś otrzymać w pliku źródłowym taką funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jeszcze jedna rzecz!
Klawisze jakie możesz wychwycić za pomocą VK_<klawisz> -> tak jak u góry masz przykład wychwycenia klawisza ENTER (nie wiem czemu Borland użył przedpotopowej nazwy RETURN pamiętającej jeszcze C64...).
Te klawisze, których możesz użyć to:
Składnia: [ Pobierz ] [ Ukryj ]
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To jest skopiowane z Help -> Tematy pomocy -> z wklepanego: "VK_" i wybranego tematu pomocy: "Virtual Key Codes".


Druga sprawa, to to, że kiedy używasz Memo i wpisujesz coś do tego komponentu za pomocą Lines->Add, to nie używasz specyfikatorów formatowania (takich jak: %s, %d, etc.), bo tego wymaga tylko funkcja printf w C.
Jeśli chcesz podać jakąś zmienną do funkcji Add (Memo) to podajesz ją m.in. w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Polecam:
Help -> Tematy pomocy -> znajdź i wklep np. OnKeyUp
taką stronkę:
http://programowanie.cal.pl/cyfbar/
i forum Borland C++ Builder Cyfrowego Barona, gdzie można sporo znaleźć:
http://programowanie.cal.pl/forum/index.php

Pozdrawiam! j23 Jarek

_________________
"O sygnałach bez całek" Czesław Frąc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 20:10 
Offline
Użytkownik

Dołączył(a): 31 sie 2014
Posty: 135
Lokalizacja: Racibórz (okolice)
Pomógł: 0

dzięki J23 :)

powoli zaczynam ogarniać te różnice pomiedzy C++ a Delphinkiem. Jeśli chodzi o VCL i to co z nimi związane, to to znam od dawna. Główną trudność stanowi dla mnie to, że Borland C++ ma np. -> zamiast kropki. Albo String costam; a nie string costam; <0 czyli wielkość znaków jest ważna, w delphi tego nie było.
W Delphi ogarniałem całe aplikacje bazodanowe, a tu mam problem z podstawami.... które są identyczne tu i tu. Aż smutne :(
Interface środowiska IDE jest mi znany od podszewki. Jest identyczny jak u brata Delphinka ;)

Dzięki za cenne wskazówki :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 20:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 maja 2014
Posty: 317
Pomógł: 19

Shiro napisał(a):
dzięki J23 :)
(...)
Nie ma sprawy. ;)
Jest jeszcze taka książka, jakbyś ją mógł dorwać w jakiejś bibliotece albo gdzieś:
"C++ Builder 6 i bazy danych", autor: Marian Wybrańczyk
Obrazek

Wbrew pozorom nie jest ona tylko o bazach danych, ale o różnych innych ciekawych sprawach także jak np. biblioteki DLL.

Pozdrawiam! ;) j23 Jarek

_________________
"O sygnałach bez całek" Czesław Frąc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO