Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi

Автор: 2Polkan
Дата сообщения: 30.07.2005 11:35

Цитата:
кстати, откуда ты взял такую формулировку по self? self на то и есть, что без всяких префиксов

надо же пример привести :))). Придумал перове попавшееся...

Кстати, дай нормальные ссылки... а то никак не зайду :)

Добавлено:
еще вопрос: если у меня в Мемо загружается большой файл, какой функцией прервать его загрузку? Блин, отдал другу книгу почитать в такой момент :)
Автор: Larry
Дата сообщения: 30.07.2005 14:43
Подскажите, пожалуйста, как реализовать функцию поиска фразы/слова в тексте? Допустим, на форме лежит Memo, Edit и Button. В Memo размещен текст, в Edit набираем слово или фразу, давим Button. Если содержимое поля Edit найдено в Memo, то функция возвращает результат true.

Заранее благодарен за ответ...
Автор: GloThin
Дата сообщения: 30.07.2005 15:19
Larry

Цитата:
как реализовать функцию поиска фразы/слова в тексте?

Попробуй классический метод - используй функцию POS(), параметры, вернее порядок не помню, один из них строка которую ищешь, другой- в которой ищешь. Возвращает позицию первого вхождения искомой строки в той, где ищешь. Если не найдено - результат, по-моему=0. Детали можешь уточнить в Helpe.
Автор: Larry
Дата сообщения: 30.07.2005 15:43
GloThin, спасибо.
Автор: DroN_S
Дата сообщения: 31.07.2005 07:32
Larry
Вот такой пример кода:


Код:
procedure TfrmMain.cxButton1Click(Sender: TObject);
var
t:TextFile;
s,s1:string;
begin
s1:=ExtractFilePath(paramStr(0))+'\Base.txt';
AssignFile(t,S1);
reset(t);
while not eof(t) do
begin
readln(t,s);
if pos(cxTextEdit1.Text, s)<>0 then
begin
cxMemo1.Lines.Add(s);
Label1.Caption := 'Найдено -- ' + IntToStr(cxMemo1.Lines.Count);
end;
end;
if cxMemo1.Lines.Count = 0 then
cxMemo1.Text := ' Ничего не найдено';
closeFile(t);
end;
Автор: GloThin
Дата сообщения: 31.07.2005 07:58
DroN_S

Код: if pos(cxTextEdit1.Text, s)<>0 then
begin
cxMemo1.Lines.Add(s);
Label1.Caption := 'Найдено -- ' + IntToStr(cxMemo1.Lines.Count);
end;
Автор: moonrise
Дата сообщения: 31.07.2005 08:15
Sleepwalker
почему не должна?
можно до посылки анонимуса Receiveln(); послать
все равно ничего не меняется

а не работает.. он только приглашение в мемо выводит
Автор: Sleepwalker
Дата сообщения: 31.07.2005 11:11
moonrise
ну. Ничего сказать не могу, надо брать проект и тестировать. А чего компонент idFTp не захотел взять? не проще будет?

Добавлено:
2Polkan
нормальные ссылки куда? на помощь??? у тебя справка стандартная не установлена, что ли? на компоненте жмешь F1 и читаешь.


Цитата:
сли у меня в Мемо загружается большой файл, какой функцией прервать его загрузку?

думаю что никак (при обычном раскладе). Разве что переписать самому функцию Tstrings.readfromfile. Там ничего сложного нет, весь код доступен в исходниках.
Автор: DroN_S
Дата сообщения: 31.07.2005 11:27
GloThin

Цитата:
Человек просил помощи именно найти строку в заполненном MEMO, а ты ищешь строку при чтении из файла и выдаешь в MEMO и считаешь количество строк.

Это пример поиска строки в файле, а что мешает поменять содержимое файла на содержимое МЕМО поля? Ничего сложного!!!!


Цитата:
if cxMemo1.Lines.Count = 0 then
cxMemo1.Text := ' Ничего не найдено';
closeFile(t);


А это просто сообщение, если искомая строка не найдена...
Это можно и не писать, просто код взят из действующего проекта!!!
Автор: moonrise
Дата сообщения: 31.07.2005 12:09
Sleepwalker

Цитата:
ну. Ничего сказать не могу, надо брать проект и тестировать. А чего компонент idFTp не захотел взять? не проще будет?

так фактически это весь "проект"
только еще мемка есть в которой 2 тестовых фтп забито. могу на почту закинуть.

в idFTp не нашел возможность отключения блокирующего режима, да и не уверен я в корректности его захода

Добавлено:
попытался на idFTp

Код: unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdFTP, StdCtrls, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Memo2: TMemo;
IdFTP1: TIdFTP;
Timer1: TTimer;
Label1: TLabel;
Memo3: TMemo;
IdAntiFreeze1: TIdAntiFreeze;
procedure Button1Click(Sender: TObject);
procedure IdFTP1AfterClientLogin(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
T_me: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
J: Integer;
begin
Memo1.Clear;
Memo3.Clear;
Memo3.Lines.Add('Start: ' + TimeToStr(Time));
T_me := 0;
Timer1.Enabled := True;
for J := 1 to 255 do // Iterate
begin
for I := 0 to memo2.Lines.Count - 1 do // Iterate
begin
with TidFTP.Create(self) do
begin
try
Name := 'FTP_' + IntToStr(J) + '_' + IntToStr(I);
Host := memo2.Lines[I]+IntToStr(J);
Port := 21;
username := 'anonymous';
password := 'FTP_bot';
OnAfterClientLogin := IdFTP1AfterClientLogin;
try
Memo1.Lines.Add(TimeToStr(Time) + ' : ' + Host + ' Try connected');
Connect(true, 150);
except
// Memo1.Lines.Add(TimeToStr(Time) + ' : ' + Host + ' Error');
end;
finally
Destroy;
end;
end
end; // for
end; // for
Timer1.Enabled := False;
Memo3.Lines.Add('Stop: ' + TimeToStr(Time));
Memo3.Lines.Add('Time (sec): ' + IntToStr(T_me));

end;

procedure TForm1.IdFTP1AfterClientLogin(Sender: TObject);
begin
Memo1.Lines.Add((Sender as TidFTP).Host + ': Anonym') ;
(Sender as TidFTP).Disconnect;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo2.Clear;
Memo2.Lines.Add('10.130.2.');
Memo2.Lines.Add('10.130.4.');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
T_me := T_me + 1;
end;

end.
Автор: Sleepwalker
Дата сообщения: 31.07.2005 19:42

Цитата:
а вот если ответа нету, то фигово он в бесконечный уходит
думаю как избежать

Поставить таймер и вываливаться по таймауту, или счетчик с паузой, или тики виндовые считать. Тайм-аут в любом виде
Автор: ShIvADeSt
Дата сообщения: 01.08.2005 01:07

Цитата:
а вот если ответа нету, то фигово он в бесконечный уходит
думаю как избежать

Сделать это в потоке, а поток по таймауту рубить, ИМХО более грамотно, чем в основном потоке проверять. В случае какого либо глюка, приложение просто не будет отвечать, а так основной поток всегда работает.
Автор: GloThin
Дата сообщения: 01.08.2005 06:00
DroN_S

Цитата:
Это пример поиска строки в файле, а что мешает поменять содержимое файла на содержимое МЕМО поля? Ничего сложного!!!!

так для того чтобы это было проще, достаточно трех строк кода, не надо заморачиваться со строками, ведь весь текст в MEMO - можно обрабатывать как строку. И надо делать никаких циклов, использовать счетчики и т.д.
Автор: DroN_S
Дата сообщения: 01.08.2005 14:49
GloThin
Я просто привёл обобщённый пример
Автор: moonrise
Дата сообщения: 01.08.2005 15:20
ShIvADeSt

Цитата:
Сделать это в потоке, а поток по таймауту рубить, ИМХО более грамотно, чем в основном потоке проверять. В случае какого либо глюка, приложение просто не будет отвечать, а так основной поток всегда работает.

а можно самый простой пример потоков? к примеру создание 2 кнопочек в потоках по нажатию ан 3-ю
Автор: ShIvADeSt
Дата сообщения: 02.08.2005 00:59
moonrise

Цитата:
а можно самый простой пример потоков? к примеру создание 2 кнопочек в потоках по нажатию ан 3-ю

Ну создавать кнопочки в потоках это ИМХО неправильно а вот обработку нажатия на кнопку легко, CreateThread.

Цитата:

procedure ThreadProcName;stdcall;
begin
action //здесь код события
end;

procedure TForm1.OnButtonClick;
begin
CreateThread(nil,0,@ThreadProcName,nil,0,ProtID);
end;

в общих чертах так. В принципе в потоке можно что угодно создавать, вот только не знаю, где будет обработчик событий, так как не занимался созданием контролов в потоках, обычно я туда действия пихаю.
Автор: moonrise
Дата сообщения: 02.08.2005 03:00
ShIvADeSt
т.е. правильнее создать один компанент (причем блокирующий, к примеру TidFTP) и создавать количество потоков CreateThread(nil,0,@ThreadProcName,nil,0,ProtID); ?
тогда можно ли писать:
CreateThread(nil,0,@ThreadProcName(var),nil,0,ProtID);?
Автор: GloThin
Дата сообщения: 02.08.2005 06:22
DroN_S

Цитата:
Я просто привёл обобщённый пример

Это совсем не обобщенный, а написанный для специфической ситуации и решает совсем другие задачи.
Автор: Felan
Дата сообщения: 02.08.2005 08:17
moonrise
У Indy можно выставить таймаут, тогда, если его правильно обработать, проложение не будет зависать когда "упрется в неработающий фтп".


Цитата:
тогда можно ли писать:
CreateThread(nil,0,@ThreadProcName(var),nil,0,ProtID);?

Писать, в общем случае, можно, только надо позаботиться о синхронизации параметра.
Но то, что ты имеешь ввиду, нет. Надо делать в каждом потоке по своему экземпляру компанента... они же не визуальные...
Автор: moonrise
Дата сообщения: 03.08.2005 19:53
Felan

Цитата:
Писать, в общем случае, можно, только надо позаботиться о синхронизации параметра.
Но то, что ты имеешь ввиду, нет. Надо делать в каждом потоке по своему экземпляру компанента... они же не визуальные...

благодарствую

ThreadProcName;stdcall; - это обязательное, системнозарезервированное имя или там просто указывается имя процедуры, в которой создание компанента. К примеру MakeMyComp(s: string) ?
Автор: Marinochka111
Дата сообщения: 03.08.2005 19:59
У меня такая проблема,как добавить программу в всплывающее Popup меню папки?? Ну чтобы где команды копировать,добавить в архив и т.д. было и название моей программы.Помогите пожайлуста.
Автор: moonrise
Дата сообщения: 03.08.2005 23:18
Marinochka111

Цитата:
У меня такая проблема,как добавить программу в всплывающее Popup меню папки?? Ну чтобы где команды копировать,добавить в архив и т.д. было и название моей программы.Помогите пожайлуста.

fvsq простой способ. не имеющий никакого отношения к програмиированию - добавить ярлык на свою прогу в папку c:\Documents and Settings\Администратор\SendTo\

Добавлено:
еще глянь ветки реестра:
а) для директории
HKEY_CLASSES_ROOT\Directory\shell
б) для любого файла (?)
HKEY_CLASSES_ROOT\*\shellex

в) для файла конкретного разширения (для примера - LBD от слова "лабуда")
HKEY_CURRENT_USER\Software\Classes
имя - по умолчанию
тип - REG_SZ
значение - Файл "LBD"

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lbd
смотри
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lbd\OpenWithList
и
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lbd\OpenWithProgids

а вообще - создай свое расширение, свойство папки, типы файлов, добавить. добавь все действи я нужные и пройдись поиском по реестру
Автор: ShIvADeSt
Дата сообщения: 04.08.2005 01:17
moonrise

Цитата:
а вообще - создай свое расширение, свойство папки, типы файлов, добавить. добавь все действи я нужные и пройдись поиском по реестру

Не совсем так, вернее совсем не так
В дельфи 3 был пример, как создать библиотеку, которая добавляла пункт меню Compile для файлов .dpr. Если Marinochka111 надо, пусть в ПМ даст мыло, я отошлю ей исходники, так как здесь их постить нет смысла.
Автор: moonrise
Дата сообщения: 04.08.2005 02:17
ShIvADeSt

Цитата:
Не совсем так, вернее совсем не так

вы хотите сказать, что указанный мною метод не работает? вторпой вопрос чем и как заносить эти ветки в реестр хочется делфями - право автора
Автор: ShIvADeSt
Дата сообщения: 04.08.2005 06:26
moonrise

Цитата:
вы хотите сказать, что указанный мною метод не работает?

Он сработает, но данный пункт будет появляться не только у папок, но и у файлов (если мне не изменяет память) если это не критично, то нет проблем.
Автор: Felan
Дата сообщения: 04.08.2005 09:12
moonrise

Цитата:
ThreadProcName;stdcall; - это обязательное, системнозарезервированное имя или там просто указывается имя процедуры, в которой создание компанента. К примеру MakeMyComp(s: string) ?

Честно говоря, я таким макаром никогда потоки не делал, я всегда TThread использовал, но сути это не менят.

stdcall это деректива компилятора, она обязательна, без нее не будет работать, потому, как параметры будут передаваться не правильно.
А ThreadProcName это имя любой процедуры, которая должна быть запущена в отдельном потоке, точнее любое имя процедуры.

Процедура сама по себе, кроме stdcall, самая обычная, в нутри нее так же могут быть функции, переменные, может создавать/удалять объекты и т.п.

Ну, хотя, если параметры туда сюда таскать будешь, то еще и синхронизацию надо бы обеспечить...

Вообще, думаю тебе надо почитать вот это http://www.pergolesi.demon.co.uk/prog/threads/ToC.html

Автор: Kr_Alex
Дата сообщения: 05.08.2005 12:00
Не знаю куда вопрос задать, поэтому сюда
Использую suiMainMenu, появилась такая проблема - нажимаю на первый пункт меню, а подменю появляется гд то в стороне (около последнего пункта меню). После чего это произошло - не знаю. Может кто сталкивался, как избавиться то?
Автор: Xarde
Дата сообщения: 05.08.2005 14:17
Kr_Alex
Собственную отрисовку пунктов меню не делал? Я как-то решил рисовать их самостоятельно и получил именно такой эффект - "съезжание" отрисовки в неопределенном направлении. Уже не помню, чем поправил, но рисовал все равно сам.
Автор: Kr_Alex
Дата сообщения: 05.08.2005 16:02
Xarde
Оказалось баг в версии 5.8 наблюдается при Maximize формы
В версии 5.2 этого нет.
Вот так вот

Добавлено:
Xarde
Для образования, как собственную прорисовку делать?
Автор: moonrise
Дата сообщения: 05.08.2005 19:16
ShIvADeSt

Цитата:
Он сработает, но данный пункт будет появляться не только у папок, но и у файлов (если мне не изменяет память) если это не критично, то нет проблем.

так там дже написано отдельно для дирректорий, отдельно для опр. расширения.. хотя могу путать.. не столь важно решений предложено несколько, захочет - выберет.

Добавлено:
Felan
сегодня попробую "добить" фтп-бота.. а ссылку... не уверен, что столько на инглише осилю, нео попробую

Добавлено:
зараБОТало ))) всем большой спасиб.. теперь осталось все куски вместе склеить. но это дело техники

еще вопрос из другой области...
имеется ipкамера из нее идет поток данных...
как TMemoStream преобразовать в Tstream ?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Вероятность одинакового CRC32


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.