Hm,
to nie je zlozite, ale nie je to take jednoduhe. Si predstav, ze naprogramujes prehravac ty a niekto na inom fore povie, ze chce citat z tvojej aplikacie pesnicku... Ide o to, ze moznosti je niekolko, no musi ich podporovat program.
1. Treba sa popozerat, ci neexistuje API k danej aplikacii pre medziprocesovu komunikaciu - musel by to podporovat prehravac a ty by si komunikoval pomocou nejakeho protokolu.
2. Mozno sa da zaregistrovat aplikacia ako COM, potom by stacilo naimportoval TLB (Typovu kniznicu) a pracujes s aplikaciou, akoby bola objektom v Delphi. (zalezi na aplikacii, ci je COMova) - takto sa da naimportovat napr. Windows Media Player (ODPORUCAM)
3. Komunikacia cez LAN - niektore aplikacie maju rozhranie zverejnene ako TCP server (zvyknu to byt Linuxove prehravace) - znova si treba nastudoval protokol pristupu od vyrobcu.
4. "Hacknutie" spustenej aplikacie - kazda aplikacia sa da ovladat z inej, to si vsak vyzaduje pevne nervy pri skumani "ciernej skrinky"
Zhrnute:
Treba googlit konkretnu informaciu na webe, lebo neexistuje univerzalna odpoved.
Příspěvky odeslané z IP adresy 212.55.244.–
Kresli sa stale na Canvas a ten vracia farbu bodu na suradnici X, Y. Kedze ty potrebujes Y = 0 (prvy riadok), tak len farby prekopirujes - musis vsak osetrit, aby PaintBoxy boli ronvako dlhe. Mozno ti pomoze toto:
for Index := 0 to Pred(PaintBox1.Width) do
begin
if Index <= PaintBox2.Width then
PaintBox2.Canvas.Pixels[Index, 0] := PaintBox1.Canvas.Pixels[Index, 0];
end; // FOR
Da, ale tento server to musi mat povolene, co nezvykne byt - kazdy DB server bezi lokalne/remote a ak provajder zverejni port, na ktorom fici jeho databaza, je mozne nastavit komponenty na danu komunikaciu, no ako som pisal, nie je to bezne (z hladiska bezpecnosti).
Stale si ale mozes pomoct tak, ze si vytvoris sprostredkvatela, ktory bude komunikovat s DB za teba. Je to riesenie ako skrabat sa pravou rukou po lavom uchu, ale ak potrebujes len zapisat nejaku vetu do DB na webe, tak si urobis PHP skript, ktoremu posles cez query / hidden data a ten to postne do DB. Pred rokucimi rokmi som primitivny priklad opisal, potom to publikoval iNet:
http://www.inet.sk/clanok/4337/tunnelling-4-4-http
mozno pomoze.
Tak mam strasne zle naprogramovane v Delphi6. Je to este zo strednej skoly, no obhospodaruje to X klientov, vie medzi nimi prepinat a dokonca aj posiela binarne subory. Zdrojak mozem zverejnit - ale priznavam sa, uz sa k nemu nehlasim :) je to fekal, no chodilo mi to.
Otazka vsak je, co potrebujes? Ak potrebujes komunikovat napr. tak, ze si program zisti, ci nie je na nete nova verzia programu, ak ano, tak si ju stiahne, je lepsie pouzit SOAP (webove sluzby) - je to velmi primitivne a threadovanie a vsetko sa vlastne staraju nizsie vrstvy.
Ak potrebujes vymienat DataSety (preto som kodil na strednej ten vlastny protokol), tak je neskutocne jednoduchsie pouzit distributivne programovanie ako DCOM / Corba - naucit sa to, je rovnako casovo narocne, ako napisat vlastne rutiny s tym, ze urcite budu chrobacne a pouzitelne az o nejaky cas...
Co vlastne potrebujes? Potrebujes editovat grid? Ci len data pchat do tabulky? Skus pouzit SQLite, alebo si napis vlastne stlpcove editory pre VirtualTree... Ale ak chces len pracu s Gridom, tak si ho najprv nastav (napr. vo FormCreate, alebo lepsie naklikaj vlastnosti v design-time:
// Lepsie naklikat v design-time
with StringGrid1 do
begin
ColCount := 3; // Pocet stlpcov
FixedCols := 0;
FixedRows := 0;
RowCount := 0;
end; // WITH
a potom napr. tlacidlo pridaj urobi nieco take
StringGrid1.Cells[0, Pred(StringGrid1.RowCount)] := Edit1.Text;
StringGrid1.Cells[1, Pred(StringGrid1.RowCount)] := Edit2.Text;
StringGrid1.Cells[2, Pred(StringGrid1.RowCount)] := Edit3.Text;
StringGrid1.RowCount := Succ(StringGrid1.RowCount); // Pridame riadok
Vedel som, ze nieco take som robil, len to stacilo poludctit ;)
Urcite by som takto nepristupoval ku obsahu XLS, ale to je jedno. V tom kode zasa az taky problem nevidim. Problem musi byt logicky niekde za showmessage. Skus si to skroknut, alebo pastni viac kodu.
Napr. cez format (nie je vsak najrychlejsi ak to chces robit v nejakych hardcore cykloch):
[CODE]
procedure TForm1.Button1Click(Sender: TObject);
var
R: Double;
begin
R := 0.1;
Label1.Caption := Format('%0.3f', [R]);
end;
[/CODE]
Použi na to Timer. Pastujem jednoduchý príkladik na otázky typu ANO / NIE.
Potrebuješ TTimer a ActionList s dvoma akciami ANO / NIE odkazujúce na ten istý EXECUTE ActionOdpovedExecute.
Timeru nastav OnTimer event: TimerTimer. Ten sa stará o to, že sleduje "časomieru", ktorá po štvrť sekunde sa refrešuje, keď progressbar pozícia dosiahne maximum, tak sa skočí na novú otázku.
unit UTFormJednodnoduchyTester;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ActnList, ComCtrls, StdCtrls, Buttons;
resourcestring
// ---------------------------------------------------------------------------
sPretecenaOtazka = 'Interná chyba: Otázky pretiekli!';
type
// ---------------------------------------------------------------------------
TFormJednodnoduchyTester = class(TForm)
BitBtnAno: TBitBtn;
BitBtnNie: TBitBtn;
LabelOtazka: TLabel;
LabelOdpoved: TLabel;
ProgressBarCakajuciInterval: TProgressBar;
ActionList: TActionList;
ActionAno: TAction;
ActionNie: TAction;
Timer: TTimer;
procedure TimerTimer(Sender: TObject);
procedure ActionOdpovedExecute(Sender: TObject);
private
FOtazka: Integer; // Aktualna otazka
FSpravnych: Integer; // Kolko spravnych odpovedi je zaznamenanych
function DajVProgrese: Boolean;
procedure NastavVProgrese(const Hodnota: Boolean);
procedure NastavOtazku(const Hodnota: Integer);
protected
procedure ZacniTestovat;
procedure CakazSOdpovedou;
procedure ZacniOdpoved;
procedure UkonciOdpoved;
procedure DalsiaOtazka;
procedure KoniecTestu;
property VProgrese: Boolean read DajVProgrese write NastavVProgrese;
public
constructor Create(AOwner: TComponent); override;
property Otazka: Integer read FOtazka write NastavOtazku;
end; // TFormJednodnoduchyTester
var
FormJednodnoduchyTester: TFormJednodnoduchyTester;
implementation
type
// ---------------------------------------------------------------------------
TOtazka = record
Znenie: String;
Odpoved: Boolean;
end; // TOtazka
const
// ---------------------------------------------------------------------------
CAKAJ_MS = 3000; // Cakaj milisekund
OTAZKY : Array[0..3] of TOtazka =
((Znenie: 'Volas sa Margita Figuli?'; Odpoved: False),
(Znenie: 'Pochadzas zo Zeme'; Odpoved: True),
(Znenie: 'Milujes pivo?'; Odpoved: True),
(Znenie: 'Neznasas Fica'; Odpoved: True)
); // OTAZKY
{$R *.dfm}
// *****************************************************************************
// Zabezpeci refresovanie progressbaru
procedure TFormJednodnoduchyTester.TimerTimer(Sender: TObject);
begin
CakazSOdpovedou;
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.ActionOdpovedExecute(Sender: TObject);
var
Tlacidlo: Boolean;
begin
// Zistime, ci sa spravne odpovedalo a podla toho aj priradime farbu odpovede
Tlacidlo := (Sender = ActionAno); // Na ktore tlacidlo sa kliklo?
if Tlacidlo <> OTAZKY[FOtazka].Odpoved then
LabelOdpoved.Font.Color := clRed
else
begin
LabelOdpoved.Font.Color := clBlack;
Inc(FSpravnych); // Zapamatame si, ze bola spravna odpoved
end; // ELSE
// Spustime proces cakania so zobrazenim odpovede
ActionAno.Enabled := False;
ActionNie.Enabled := False;
if OTAZKY[FOtazka].Odpoved then
LabelOdpoved.Caption := 'ÁNO'
else
LabelOdpoved.Caption := 'NIE';
ZacniOdpoved;
end;
// *****************************************************************************
function TFormJednodnoduchyTester.DajVProgrese: Boolean;
begin
Result := Timer.Enabled;
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.NastavVProgrese(const Hodnota: Boolean);
begin
Timer.Enabled := Hodnota;
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.NastavOtazku(const Hodnota: Integer);
begin
if (Hodnota < Low(OTAZKY)) or (Hodnota> High(OTAZKY)) then
raise Exception.CreateRes(@sPretecenaOtazka);
FOtazka := Hodnota;
LabelOtazka.Caption := OTAZKY[FOtazka].Znenie;
LabelOdpoved.Caption := '';
ActionAno.Enabled := True;
ActionNie.Enabled := True;
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.ZacniTestovat;
begin
Otazka := 0; // Skoc na prvu otazku
FSpravnych := 0; // Zatial ziadna spravna odpoved
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.CakazSOdpovedou;
begin
if (not VProgrese) then
ZacniOdpoved
else
begin
ProgressBarCakajuciInterval.Position := ProgressBarCakajuciInterval.Position + 1;
if ProgressBarCakajuciInterval.Position = ProgressBarCakajuciInterval.Max then
UkonciOdpoved;
end; // IF
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.ZacniOdpoved;
const
REFRESH = 250; // Refresh v milisekundach - cim menej tym plynulejsie ale zatazuje viac system
begin
try // EXCEPT
ProgressBarCakajuciInterval.Position := 0;
ProgressBarCakajuciInterval.Max := CAKAJ_MS div REFRESH;
Timer.Interval := REFRESH;
VProgrese := True;
except
VProgrese := False;
end; // EXCEPT
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.UkonciOdpoved;
begin
VProgrese := False;
ProgressBarCakajuciInterval.Position := 0;
DalsiaOtazka;
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.DalsiaOtazka;
begin
if FOtazka = High(OTAZKY) then
KoniecTestu
else
Otazka := Otazka + 1;
end;
// *****************************************************************************
procedure TFormJednodnoduchyTester.KoniecTestu;
begin
ShowMessage('Koniec testu!'#13#10 +
'Správnych odpovedí: ' + IntToStr(FSpravnych) + #13#10 +
'Všetkých otázok: ' + IntToStr(Length(OTAZKY)));
Close;
end;
// *****************************************************************************
constructor TFormJednodnoduchyTester.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Timer.Enabled := False;
ZacniTestovat;
end;
end.