|
Вопрос # 418/ вопрос открыт / |
|
Доброго врямя суток уважаемые програмисты.
У меня есть строка (на пример "_X@x^2$-25$-_x-8@x^2$-10x+25$$:_x-20@x-5$^2")
Надо чтобы у програме UMS вводились соотвецтвенные выражения ("http://seledka2.ho.com.ua/1.png")
Вопрос у следущем: как сделать так чтобы когда цифры - писать их (посылать ей нажатие), а когда символы(^#&...) мышка нажимала на соотвецтвующие коорденаты, или на стрелки вправо($) и вниз(@)???
Помогить плз. В пятницу вступительный экзамен по алгебре. Прога будет читьать файл (по строкам, каждая строка - новый пример) и по ФТП и туда же ложить ответ. С ФТП я разобрался, а вот с вводом проблемы. Прошу помощи.
Приложение: Переключить в обычный режим-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
- IdFTP, StdCtrls, ExtCtrls, idftpcommon;
-
- type
- TForm1 = class(TForm)
- IdFTP1: TIdFTP;
- Timer1: TTimer;
- Button1: TButton;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- // ------------------------------- START PROCEDURES ----------------------------
-
- function LinesCount(const Filename: string): Integer;
- var
- HFile: THandle;
- FSize, WasRead, i: Cardinal;
- Buf: array[1..4096] of byte;
- begin
- Result := 0;
- HFile := CreateFile(Pchar(FileName), GENERIC_READ, FILE_SHARE_READ, nil,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if HFile <> INVALID_HANDLE_VALUE then
- begin
- FSize := GetFileSize(HFile, nil);
- if FSize > 0 then
- begin
- Inc(Result);
- ReadFile(HFile, Buf, 4096, WasRead, nil);
- repeat
- for i := WasRead downto 1 do
- if Buf[i] = 10 then
- Inc(Result);
- ReadFile(HFile, Buf, 4096, WasRead, nil);
- until WasRead = 0;
- end;
- end;
- CloseHandle(HFile);
- end;
-
-
-
- procedure Delay(dwMilliseconds: Longint);
- var
- iStart, iStop: DWORD;
- begin
- iStart := GetTickCount;
- repeat
- iStop := GetTickCount;
- Application.ProcessMessages;
- until (iStop - iStart) >= dwMilliseconds;
- end;
-
-
-
- function GrabLine(const s: string; ALine: Integer): string;
- var
- sl: TStringList;
- begin
- sl := TStringList.Create;
- try
- sl.LoadFromFile(s);
- Result := sl[ALine - 1]; // index off by one
- finally
- sl.Free;
- end;
- end;
-
-
-
-
- // -------------------------------- END PROCEDURS ------------------------------
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- timer1.Enabled:=true;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- with IdFTP1 do
- try
- Username:='nazemnow';
- Password:='nazemnow';
- Host:='s4.ho.com.ua';
- Connect;
- IdFTP1.ChangeDir('/ums');
- IdFTP1.TransferType:=ftBinary;
- finally
-
- end;
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- var i{, Xint, Yint}: integer;
- s{, Xstr, Ystr, wrd}: string;
- begin
- IdFTP1.Get('primer.txt', '.dataprimer.txt',true);
- for i:=0 to LinesCount('.dataprimer.txt') do begin
- s:=GrabLine('.dataprimer.txt', i);
-
- // START \
-
-
-
-
- // FINISH \
-
- end;
- end;
-
- end.
 |
Вопрос задал: Наземнов Вячеслав (статус: Посетитель)
Вопрос отправлен: 19 марта 2007, 19:25
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Да, дожились. Мы в своё время ручками решали всё. Так надёжнее.
Теперь по вопросу. То, что вы хотите, называется лексический парсер. Только в вашем случае он предельно прост.Код я привожу ниже, но его лучше вынести в отдельный поток - будет чётче работать. Именно для этого по коду разбросаны Sleep(10).
Почему не привожу полный код? Если вы в математике не хотите разбираться, тогда программист не получиться.
Так как у меня нет этой проги, а решать я и без неё умею, то некоторые вещи в коде вам прийдётся догадываться самому.
Приложение: Переключить в обычный режим- function Solve(s:string):boolean;
- var i:integer;
- h:THandle;
- begin
-
-
-
- for i:=1 to length(s) do begin
- case s[i] of
- '0'..'9','.','.':SendMessage(h,WM_CHAR,ord(s[i],0);
-
- '^':
- end;
- sleep(10);
- end;
- end;
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 20 марта 2007, 11:24
Оценка за ответ: 5
Комментарий к оценке: Спасибо большое. То что надо.
Вадим К - респект !!!
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|