Dante napisał(a):A jak poradzić sobie z napisaniem biblioteki, która musi skorzystać z pliku nagłówkowego aplikacji.
Tak przypuszczałem, jednak za wiele jest nie wiadomych by można było wprowadzić jakieś uniwersalne rozwiązanie. Nie wiem przecież jak będzie nazwa TForm, oraz jak będa nazywały się pliki.Tworzysz sobie bibliotekę, potem gdy tworzysz program kopiujesz pliki biblioteki do katalogu programu, dodajesz do projektu i modyfikujesz zawartość biblioteki tak by prawidłowo współpracowała z projektem,
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
void __fastcall Funkcja(TForm *Okno, TColor kolor)
{
Okno->Color = kolor;
}
#include "Unit1.h"
#include "Unit2.h" // dołączanie biblioteki
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Funkcja(this, clRed);
}
//---------------------------------------------------------------------------
void __fastcall Funkcja(TPanel *Panel, TColor kolor)
{
Panel->Color = kolor;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Funkcja(Panel1, clRed);
}
//---------------------------------------------------------------------------
#ifndef biblioteka_hpp
#define biblioteka_hpp
#include <string>
#include "grafik.h"
//prototypy funkcji
std::string F1(std::string const lancuch);
std::string F2(std::string const URL);
void F3(std::string &lancuch);
void F4(std::string &lancuch);
//Klasa Wątek ----------------------------------------------------
class Watek : public TThread{
//WAŻNE BY ZMIENIĆ NAZWĘ TForm NA TAKĄ JAKA JEST U CIEBIE W PROJEKCIE
TForm4 *tForm;
protected:
void __fastcall Synchro(void);
void __fastcall Execute(void);
public:
// __fastcall myThread(TForm1 *Form);
//WAŻNE BY ZMIENIĆ NAZWĘ TForm NA TAKĄ JAKA JEST U CIEBIE W PROJEKCIE
Watek(TForm4 *_form):TThread(true), tForm(_form){}
// std::string Url, stronaWWW;
};
#endif
#include "bibliotekaHTML.hpp"
//Metoda synchronizacji dla Wątku ------------------------
void __fastcall Watek::Synchro(void){
int i = 0;
if (i == 0) {
for (i = 0; i <= 10; i++) {
i++;
tForm->Memo1->Lines->Add(i);
}
}
tForm->stronaWWW = F1(F2(tForm->Url));
F3(tForm->stronaWWW);
}
//Metody----Wątek -----------------------------------------
void __fastcall Watek::Execute(void){
int i = 0;
if (i == 0) {
for (i = 0; i <= 10; i++) {
i++;
tForm->Memo1->Lines->Add(i);
}
}
Synchronize(&Synchro);
/* while(1)
Synchronize(&synchronizuj);*/
}
//---------------------------------------------------------------------------
//grafik cpp
#include <vcl.h>
#pragma hdrstop
//#include "grafik.h"
#include <biblioteka.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
Watek* watek1;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
std::string Url = "http://programowanie.cal.pl/forum/index.php", stronaWWW;
watek1 = new Watek(Form4);
Url = "http://biznes.onet.pl/gm-sprzedal-hummera-chinczykom,18561,3042137,1,news-detal";
//Url = "http://biznes.onet.pl/gm-sprzedal-hummera-chinczykom,18561,3042137,1,news-detal";
//Url = "http://www.bet-at-home.com/odd.aspx?action=toggleEventGroup&SportID=1&EventGroupID=222";
watek1->Resume();
Memo1->Text = UTF8Decode(stronaWWW.c_str());
watek1->Suspend();
delete watek1;
}
tForm->stronaWWW = F1(F2(Url));
F3(stronaWWW);
Dante napisał(a):W Memo1 nic nie ma. Dałem Breakpoint w obu metodach klasy i kompilator w ogóle nie wchodzi do tych metod. Tak jakby metod klas nie było(nie wykonywały się).
- Kod: Zaznacz cały
watek1->Resume();
Memo1->Text = UTF8Decode(stronaWWW.c_str());
watek1->Suspend();
delete watek1;
}
Dante napisał(a):Trochę eksperymentowałem i gdy do kodu Buttona dołożę dwie linijki, przed watek1->Resume();:To metody się wykonają, więc nie wiem co się stało. Dlaczego by dobrze zadziałał wątek muszę najpierw wykonać dwie funkcje, które to właśnie wątek powinien w sobie wykonać?
- Kod: Zaznacz cały
tForm->stronaWWW = F1(F2(Url));
F3(stronaWWW);
watek1->Resume();
watek1->WaitFor();
Memo1->Text = UTF8Decode(stronaWWW.c_str());
// watek1->Suspend();
delete watek1;
Dante napisał(a):Nie wiedziałem, że tak to działa.
Powrót do Biblioteki i komponenty
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości