Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В чем глюк?


Страницы:   1 2

Proud Berdiyan ©   (2002-05-01 14:54:00) 

-----------------------------------------------------------------
В чем глюк?
-----------------------------------------------------------------
Решил сделать алгоритм работающий как в
Internet Explorer, то есть если в Listbox-е встречается слово
совпадающее (частично или полностью) с введенным словом в Edite, то
в Edit вставляется текст из Listbox-а и выделяется вставленная часть текста.
Но начали сыпаться глюки!
Вот код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit1Change(Sender: TObject);
private
FPos:integer;
FCanSearch:boolean;
FSearching:boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
inherited;
Fpos:=-1;
FSearching:=false;
FCanSearch:=true;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Chr(Key) in ["A".."z","А".."Я","а".."я"] then FCanSearch:=true
else FCanSearch:=false;
inherited;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var i,l:integer;
begin
inherited;
if FSearching then Exit;
if not FCanSearch then Exit;
if Text="" then exit;
l := Length(EDIT1.Text);
for i:=0 to LISTBOX1.items.Count-1 do
if Copy(LISTBOX1.items[i],1,l)=EDIT1.Text then begin
FSearching:=true;
FPos := i;
LISTBOX1.ItemIndex:=i;
FSearching := false;
EDIT1.SelStart := Length(EDIT1.Text);
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelLength := -(Length(LISTBOX1.items[i])-l);
end;
end;

end.

Теперь, в Listbox-е есть три строчки:
C:\
C:\Windows\System
SYSTEM

Запустим… все вроде нормально, когда я ввожу в edit букву S, то текст становится SYSTEM и все символы после S выделяются!
Тут проблем нету, но когда я в edit-е напишу C, то текст становится C:\Windows\System,
А ВЫДЕЛЯЕТСЯ ТОЛЬКО ДВА ЗНАКА ПОСЛЕ С - :\!!!
В чем глюк?
Помогите разобраться пожалуйста!
-----------------------------------------------------------------


Song   (2002-05-05 11:09:00) [1]

что-то Delphi затупил
Походу дела давно уже тупит...


Proud Berdiyan   (2002-05-05 00:55:00) [2]


> Atrem (04.05.02 23:27)

Извиняюсь, то у меня что-то Delphi затупил!
ВСЕ РАБОТАЕТ ВРОДЕ!
Ты гений :), я тут еще посмотрю, протестирую, но пока проблем нету, все работает как часики!
Спасибо!


Proud Berdiyan   (2002-05-05 00:16:00) [3]


> Atrem (04.05.02 23:27)

Уже ближе!
Ввожу C, текст становится C:\ выделяется :\ - как положено!
С System тоже нормально, но стоит ввести C:\W как все валится, вылазит ошибка, виснет, и все!
Вопрос остается открытым!
Помогите пожалуйста!


Proud Berdiyan   (2002-05-05 00:13:00) [4]


> Atrem (04.05.02 23:27)

Уже ближе!
Ввожу C, текст становится C:\ выделяется :\ - как положено!
С SYSTEM тоже нормально, но стоит ввести C:\W как все валится, вылазит ошибка, виснет, и все!
Вопрос остается открытым!
Помогите пожалуйста!


Atrem   (2002-05-04 23:27:00) [5]

Попробуй вот этот код(изменил только процедуру изменения edit):

procedure TForm1.Edit1Change(Sender: TObject);
var i,l,er:integer;
begin
if FSearching then Exit;
if not FCanSearch then Exit;
if Text="" then exit;
l:=length(Edit1.Text);
er:=ListBox1.Perform(LB_SELECTSTRING,-1,longint(pchar(Edit1.Text)));
if er=lb_err then exit;
Edit1.Text:=ListBox1.Items[er];
Edit1.SelStart:=l;
Edit1.SelLength:=length(Edit1.Text)-l;
end;


Proud Berdiyan   (2002-05-04 21:26:00) [6]

Я что-то не понял, вы все помогаете мне или просто говорите, что вам тут не нравится?
Опять не выходит! Тут кто-то говорил, что у него все работает, так напиши код, пожалуйста!
Шо за хрень тут?
Все такие умные, столько строчек кода написали, а вы его проверяли, или просто ляпнули, не зная что?
Та же ситуация, не @рена не работает!
Помогите пожалуйста, можно не перекручивать этот код, а если кто сталкивался с такой проблемой – поделитесь опытом, помогите написать другой код что бы решить эту задачу!
Как братьев по оружию прошу!
Заранее благодарю!
Вопрос остается открытым!


fnv-hope   (2002-05-04 02:49:00) [7]

Мне тоже много чаво не нравится.

procedure TForm1.Edit1Change(Sender: TObject);
var i,l:integer;
begin
inherited;
if FSearching then Exit;
// если написать:
// if (not FCanSearch) or (Text = "") then Exit;
// эффект будет тот же, что и у двух операторов ниже
if not FCanSearch then Exit;
if Text="" then exit;
l := Length(EDIT1.Text);
// если здесь написать, что
// Edit1.OnChange := nil;
// то от FSearching можно вообще отказаться
for i:=0 to LISTBOX1.items.Count-1 do
if Copy(LISTBOX1.items[i],1,l)=EDIT1.Text then begin
FSearching:=true;
FPos := i;
LISTBOX1.ItemIndex:=i;
FSearching := false;
// очень похоже на i, только прописную I ???
// l выглядит иначе: LLLL
EDIT1.SelStart := I;
// не очень уверена, но есть подозрение, что, поскольку
// FSearching := False, этот код (Text := ...) приведёт к вызову
// Edit1Change, извините за неуверенность.
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelLength := -(Length(LISTBOX1.items[i])-l);
Break;
end;
// а здесь тогда надо
// Edit1.OnChange := Edit1Change;
end;




fnv-hope   (2002-05-04 02:48:00) [8]

Мне тоже много чаво не нравится.

procedure TForm1.Edit1Change(Sender: TObject);
var i,l:integer;
begin
inherited;
if FSearching then Exit;
// если написать:
// if (not FCanSearch) or (Text = "") then Exit;
// эффект будет тот же, что и у двух операторов ниже
if not FCanSearch then Exit;
if Text="" then exit;
l := Length(EDIT1.Text);
// если здесь написать, что
// Edit1.OnChange := nil;
// то от FSearching можно вообще отказаться
for i:=0 to LISTBOX1.items.Count-1 do
if Copy(LISTBOX1.items[i],1,l)=EDIT1.Text then begin
FSearching:=true;
FPos := i;
LISTBOX1.ItemIndex:=i;
FSearching := false;
// очень похоже на i, только прописную I ???
// l выглядит иначе: LLLL
EDIT1.SelStart := I;
// не очень уверена, но есть подозрение, что, поскольку
// FSearching := False, этот код (Text := ...) приведёт к вызову
// Edit1Change, извените за неуверенность.
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelLength := -(Length(LISTBOX1.items[i])-l);
Break;
end;
// а здесь тогда надо
// Edit1.OnChange := Edit1Change;
end;




Proud Berdiyan   (2002-05-04 00:26:00) [9]

Вопрос остается открытым!


Proud Berdiyan   (2002-05-03 22:15:00) [10]

Не выходит! :)
Шо за…
Ставлю C, текст становится С:\ И ВЕСЬ ВЫДЕЛЯЕТСЯ!
Шо за хрень?
Пишу S, текст становиться SYSTEM И ВЫДЕЛЯЕТСЯ STEM
Может, у кого есть другой способ решить эту проблему?
Люди, помогите пожалуйста, очень прошу!
Заранее благодарен!
Код модуля:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Edit1Change(Sender: TObject);
private
FPos:integer;
FCanSearch:boolean;
FSearching:boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
inherited;
Fpos:=-1;
FSearching:=false;
FCanSearch:=true;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Chr(Key) in ["A".."z","А".."Я","а".."я"] then FCanSearch:=true
else FCanSearch:=false;
inherited;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var i,l:integer;
begin
inherited;
if FSearching then Exit;
if not FCanSearch then Exit;
if Text="" then exit;
l := Length(EDIT1.Text);
for i:=0 to LISTBOX1.items.Count-1 do
if Copy(LISTBOX1.items[i],1,l)=EDIT1.Text then begin
FSearching:=true;
FPos := i;
LISTBOX1.ItemIndex:=i;
FSearching := false;
EDIT1.SelStart := I;
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelLength := -(Length(LISTBOX1.items[i])-l);
Break;
end;
end;

end.

???


Song   (2002-05-03 20:16:00) [11]

procedure TForm1.Edit1Change(Sender: TObject);
var i,l:integer;
begin
inherited;
if FSearching then Exit;
if not FCanSearch then Exit;
if Text="" then exit;
l := Length(EDIT1.Text);
for i:=0 to LISTBOX1.items.Count-1 do
if Copy(LISTBOX1.items[i],1,l)=EDIT1.Text then begin
FSearching:=true;
FPos := i;
LISTBOX1.ItemIndex:=i;
FSearching := false;
EDIT1.SelStart := I;
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelLength := -(Length(LISTBOX1.items[i])-l);
Break;
end;
end;

end.


Proud Berdiyan   (2002-05-03 19:31:00) [12]


> Song © (03.05.02 18:37)

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


Song   (2002-05-03 18:37:00) [13]

Сделай так как тебе посоветовал Shaman_Naydak © (01.05.02 18:38)
Я только что проверил.
Сделай регистронезависимое решение


Proud Berdiyan   (2002-05-03 17:21:00) [14]

Вопрос остается открытым!


Proud Berdiyan   (2002-05-03 12:15:00) [15]

???


Proud Berdiyan   (2002-05-02 00:14:00) [16]

Не выходит!
Может я правда не так сделал, но все-таки лучше напиши пожалуйста код на событие Edit1Change как ты там сказал!


Shaman_Naydak   (2002-05-01 18:38:00) [17]

ПОможет, поможет.. не все баги просто еще забиты ногами.
Поставь свой FSearching := false;
перед break, а не после LISTBOX1.ItemIndex:=i;

Честно говоря, код просто жуткий..

Для заметки.. у тебя проверка стоит регистрочувствительная,
+ посоветую в ListBox"e держать строчки отсортированными, чтобы
при наличии более одной подходящей оставлять ту, которая покороче, или усложнить алгоритм нахождения


Proud Berdiyan   (2002-05-01 18:14:00) [18]

А вот ты и не прав, это не поможет!
Пишу C текст становится C:\, и выделяется только первый символ –C, а это мне не подходит, даже оригинал лучше!
Вопрос остается открытым!
Пожалуйста помогите!


Shaman_Naydak   (2002-05-01 18:00:00) [19]

Мне много чего не нравится в написанном коде, но
если говорить по существу:
Заменить
EDIT1.SelStart := Length(EDIT1.Text);
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelLength := -(Length(LISTBOX1.items[i])-l);

на
EDIT1.Text := LISTBOX1.items[i];
EDIT1.SelStart := l;
EDIT1.SelLength := MaxInt;
break; // <- вот он, момент истины


VID   (2002-05-01 17:23:00) [20]

ну у меня та же хрень: IEComboBox... так что sorry:)))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо