Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-64633
Riko
2002-05-08 12:56
2002.05.20
Переустановка компонентов...


14-64810
False_Delirium
2002-04-11 09:26
2002.05.20
Консультирует Борланд...


1-64689
Windeus
2002-05-05 12:14
2002.05.20
Запуск программы открытием файлов


1-64596
Феликс
2002-05-07 18:09
2002.05.20
Как прочитать из реестра все парметры?


3-64542
Hamster
2002-04-22 12:00
2002.05.20
Подскажите, как избежать ввода пароля при открытии базы..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский