Форум: "Основная";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
ВнизВ чем глюк? Найти похожие ветки
← →
Proud Berdiyan (2002-05-01 14:54) [0]-----------------------------------------------------------------
В чем глюк?
-----------------------------------------------------------------
Решил сделать алгоритм работающий как в
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,
А ВЫДЕЛЯЕТСЯ ТОЛЬКО ДВА ЗНАКА ПОСЛЕ С - :\!!!
В чем глюк?
Помогите разобраться пожалуйста!
-----------------------------------------------------------------
← →
VID (2002-05-01 15:32) [1]слушай, может не будешь париться с этим , и я те компонент вышлю такой какой ты хочешь ? :)))
сам правда не проверял его, верю описанию
← →
Proud Berdiyan (2002-05-01 16:27) [2]
> VID © (01.05.02 15:32)
Спасибо, но у меня есть такой компонент – IECombobox, но, дело в том, что он является потомком класса Tcombobox, и у него нету свойства BorderStyle, которое мне очень надо!
Правда если у тебя имеется такой компонентик отвечающий моим требованиям, то кидай на мыло – буду очень благодарен!
Вопрос остается открытым!
Помогите пожалуйста, кто чем может!
← →
Malder (2002-05-01 16:32) [3]Proud Berdiyan, ну так посмотри исходник IECombobox и спиши решение оттуда...
← →
Proud Berdiyan (2002-05-01 16:41) [4]Хорошая идея!
Только я сначала так и сделал :)
Скатал, исправил, но…после долгих часов мучений у меня так нечего и не получилось!
А жаль, ведь компонента работает, а у меня нет, что за хреновина!
Вопрос остается открытым!
Помогите, кто чем может!
← →
VID (2002-05-01 17:23) [5]ну у меня та же хрень: IEComboBox... так что sorry :)))
← →
Shaman_Naydak (2002-05-01 18:00) [6]Мне много чего не нравится в написанном коде, но
если говорить по существу:
Заменить
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; // <- вот он, момент истины
← →
Proud Berdiyan (2002-05-01 18:14) [7]А вот ты и не прав, это не поможет!
Пишу C текст становится C:\, и выделяется только первый символ –C, а это мне не подходит, даже оригинал лучше!
Вопрос остается открытым!
Пожалуйста помогите!
← →
Shaman_Naydak (2002-05-01 18:38) [8]ПОможет, поможет.. не все баги просто еще забиты ногами.
Поставь свой FSearching := false;
перед break, а не после LISTBOX1.ItemIndex:=i;
Честно говоря, код просто жуткий..
Для заметки.. у тебя проверка стоит регистрочувствительная,
+ посоветую в ListBox"e держать строчки отсортированными, чтобы
при наличии более одной подходящей оставлять ту, которая покороче, или усложнить алгоритм нахождения
← →
Proud Berdiyan (2002-05-02 00:14) [9]Не выходит!
Может я правда не так сделал, но все-таки лучше напиши пожалуйста код на событие Edit1Change как ты там сказал!
← →
Proud Berdiyan (2002-05-03 12:15) [10]???
← →
Proud Berdiyan (2002-05-03 17:21) [11]Вопрос остается открытым!
← →
Song (2002-05-03 18:37) [12]Сделай так как тебе посоветовал Shaman_Naydak © (01.05.02 18:38)
Я только что проверил.
Сделай регистронезависимое решение
← →
Proud Berdiyan (2002-05-03 19:31) [13]
> Song © (03.05.02 18:37)
Что-то у меня не выходит, напиши пожалуйста код как надо, что бы он работал.
Заранее благодарю!
← →
Song (2002-05-03 20:16) [14]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 22:15) [15]Не выходит! :)
Шо за…
Ставлю 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.
???
← →
Proud Berdiyan (2002-05-04 00:26) [16]
Вопрос остается открытым!
← →
fnv-hope (2002-05-04 02:48) [17]Мне тоже много чаво не нравится.
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:49) [18]Мне тоже много чаво не нравится.
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 21:26) [19]Я что-то не понял, вы все помогаете мне или просто говорите, что вам тут не нравится?
Опять не выходит! Тут кто-то говорил, что у него все работает, так напиши код, пожалуйста!
Шо за хрень тут?
Все такие умные, столько строчек кода написали, а вы его проверяли, или просто ляпнули, не зная что?
Та же ситуация, не @рена не работает!
Помогите пожалуйста, можно не перекручивать этот код, а если кто сталкивался с такой проблемой – поделитесь опытом, помогите написать другой код что бы решить эту задачу!
Как братьев по оружию прошу!
Заранее благодарю!
Вопрос остается открытым!
← →
Atrem (2002-05-04 23:27) [20]Попробуй вот этот код(изменил только процедуру изменения 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-05 00:13) [21]
> Atrem (04.05.02 23:27)
Уже ближе!
Ввожу C, текст становится C:\ выделяется :\ - как положено!
С SYSTEM тоже нормально, но стоит ввести C:\W как все валится, вылазит ошибка, виснет, и все!
Вопрос остается открытым!
Помогите пожалуйста!
← →
Proud Berdiyan (2002-05-05 00:16) [22]
> Atrem (04.05.02 23:27)
Уже ближе!
Ввожу C, текст становится C:\ выделяется :\ - как положено!
С System тоже нормально, но стоит ввести C:\W как все валится, вылазит ошибка, виснет, и все!
Вопрос остается открытым!
Помогите пожалуйста!
← →
Proud Berdiyan (2002-05-05 00:55) [23]
> Atrem (04.05.02 23:27)
Извиняюсь, то у меня что-то Delphi затупил!
ВСЕ РАБОТАЕТ ВРОДЕ!
Ты гений :), я тут еще посмотрю, протестирую, но пока проблем нету, все работает как часики!
Спасибо!
← →
Song (2002-05-05 11:09) [24]что-то Delphi затупил
Походу дела давно уже тупит...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c