Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > ComboBox


Автор: sacha1m 25.12.2005, 13:29
Уважаемые программысты, подкорректируйте пожалуйста код, Что-бы провторяющиеся значения ComboBox'ов были ликвидированы. Этот код заполняет на форме ComboBox'ы, путем выдираия текста из текстового файла протокола программы. Значение берется из строки содеращей " - начало".

Код

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
FamName,dat: string;
s:string[100];
nom,dlin:integer;

begin


// Заполняем ComboBox1  ComboBox2
AssignFile(f,ExtractFilePath(Application.ExeName)+'Protocol.txt');
Reset(f);
while not eof(f) do
 begin
  Readln(f,s);
  dlin:=length(s);
  nom:=pos(' - начало',s);
  FamName:=copy(s,1,dlin-36);
  dat:=copy(s,nom-19,10);
  if nom<>0 then begin


                 Form2.ComboBox2.Items.Add(dat);
                 Form2.ComboBox1.Items.Add(FamName);
                 nom:=0;

Автор: Albinos_x 25.12.2005, 13:59
Цитата(sacha1m @ 25.12.2005, 13:29)

AssignFile(f,ExtractFilePath(Application.ExeName)+'Protocol.txt');
Reset(f);
while not eof(f) do
begin
Readln(f,s);
dlin:=length(s);
nom:=pos(' - начало',s);
FamName:=copy(s,1,dlin-36);
dat:=copy(s,nom-19,10);
if nom<>0 then begin


Form2.ComboBox2.Items.Add(dat);
Form2.ComboBox1.Items.Add(FamName);

может где-то так:
Код
...
function Povt(var s:string; SL:TStringList):boolean;
var i:integer;
begin
for i:=0 to (SL.Count-1) do
   begin
   if pos(s,SL.Strings[i])<>0 then
      begin
      Result:=false;
      exit;
      end;
   end;
SL.Add(S);
Result:=true;
end;
...
...
var  SL : TStringList;
       S,FamName,dat : string;
       f:TextFile;
....    
begin
...
SL:=TStringList.Create;
SL.Clear;  
AssignFile(f,ExtractFilePath(Application.ExeName)+'Protocol.txt');
Reset(f);
while not eof(f) do
    begin
    Readln(f,s);
    dlin:=length(s);
    nom:=pos(' - начало',s);
    if nom<>0 then 
       begin
       FamName:=copy(s,1,dlin-36);
       dat:=copy(s,nom-19,10);
       if Povt(s,SL) then
          begin
          Form2.ComboBox2.Items.Add(dat);
          Form2.ComboBox1.Items.Add(FamName);
          end;
       end;
    end;
CloseFile(f);
SL.Free;
...
end;


Автор: Zero 25.12.2005, 14:11
Создать динамический массив, в нём перед вводом проверять каждое слово, если нововводимого нету, то ввести нововводимое слово из текстового файла.
Потом перенести массив в комбобокс.

Автор: Rrader 25.12.2005, 14:12
Цитата

function Povt(var s:string; SL:TStringList):boolean;

Код

TStringList.IndexOf(S) = -1;

Автор: Albinos_x 25.12.2005, 14:26
Цитата
function Povt(var s:string; SL:TStringList):boolean;


код Pascal/Delphi
1:
TStringList.IndexOf(S) = -1;

не догнал, чего этим хотел сказать, если ошибка, то добавь дополнительную проверку:
Код

...    
function Povt(var s:string; SL:TStringList):boolean;    
var i:integer;
    col:integer;    
begin    
col:=SL.Count;
if col>0 then
   begin
   for i:=0 to (col-1) do    
      begin    
      if pos(s,SL.Strings[i])<>0 then    
         begin    
         Result:=false;    
         exit;    
         end;    
      end;
   end;    
SL.Add(S);    
Result:=true;    
end;    
...

Добавлено @ 14:28
всё догнал... прошу прощения... невнимательность... smile

Автор: sacha1m 25.12.2005, 17:02
Прошу прошенья за некоторую тупость, но компилятор сообщает в месте
Цитата

SL.Strings.Add(S);


Цитата

бла-бла ... '['  expected but '.' found

я пробовал поставлять кв. скобку, но что-то не получается,
просто не сталкивался с такими операторами, не пойму в чем дело.?


Цитата

function Povt(var s:string; SL:TStringList):boolean;
...
...
Result:=true;
end;

я так понял это вставлять в любое место?

Автор: Albinos_x 25.12.2005, 18:37
Цитата(sacha1m @ 25.12.2005, 17:02)
я пробовал поставлять кв. скобку, но что-то не получается,
просто не сталкивался с такими операторами, не пойму в чем дело.?

тут опечатка, нада так:
Код

SL.Add(S);


Цитата(sacha1m @ 25.12.2005, 17:02)
я так понял это вставлять в любое место?

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

Автор: sacha1m 25.12.2005, 19:04
Странно , что-то все равно повторяющиеся записи не удалаются.

Глянте пожалуйста
http://www.reshetovu-net.narod.ru/3.rar
, 130кб,
там в Unit1.pas находится исправления с данной темой, может я что не так сделал?

з.ы. Правда я в Delphi2 делал , но там только Unit1.pas надо править
если увидете ошибку , киньте пожалуйста на
мыло

Автор: Albinos_x 25.12.2005, 20:06
у меня ничего не качается... кидай мне на мыло [///]

Автор: sacha1m 25.12.2005, 20:21
Заранее Спасибо!
послал.

странно, сам 10 мин назад качал со своего сайта , а сечас сам скачать не могу

Автор: sacha1m 25.12.2005, 21:17
ну как?

Автор: Albinos_x 25.12.2005, 21:25
разобрался... в первом коде мы сравнивали всю строку из файла, а у тебя в файле в принципе не может быть одинаковых строк, поэтому фильтрации не происходило... плюс к этому у тебя есь в коде небольшой глюк и одна ненужная строчка... привожу код:
Код
...
function Povt(famname:string;var SL:TStringList):boolean;
var i:integer;
    col:integer;
begin
col:=SL.Count;
if col>0 then    
   begin
   for i:=0 to (col-1) do
      begin
      if pos(famname,SL.Strings[i])<>0 then
         begin
         Result:=false;
         exit;
         end;
      end;
   end;
SL.Add(famname);
Result:=true;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var  SL : TStringList;    
       S,FamName,dat : string;    
       f:TextFile;
     nom,dlin:integer;

begin
// çàïèñü â ôàèë î íà÷àëå ñåàíñà
AssignFile(f,ExtractFilePath(Application.ExeName)+'Protocol.txt');
Append(f);  // îòêðûâàåì ôàéë äëÿ äîçàïèñè
s:=TimeToStr(time);
if length(s)<>8 then
   s:='0'+s;
writeln(f,Edit1.Text+' '+Edit3.Text+' '+s+' - íà÷àëî ñåàíñà');
CloseFile(f);
SL:=TStringList.Create;
SL.Clear;
Reset(f);
while not eof(f) do
    begin
    Readln(f,s);
    dlin:=length(s);
    nom:=pos(' - íà÷àëî',s);
    if nom<>0 then
       begin
       FamName:=copy(s,1,dlin-36);
       dat:=copy(s,nom-19,10);
       if Povt(famName,SL) then
          begin
          Form2.ComboBox1.Items.Add(FamName);
          end;
       if Povt(dat,SL) then
          begin
          Form2.ComboBox2.Items.Add(dat);
          end;
       end;
    end;
CloseFile(f);
SL.Free;
Form2.ShowModal;
end;
...

это работает без проблем... что исправлено:
Цитата
      begin
      FamName:=copy(s,1,dlin-36);
      dat:=copy(s,nom-19,10);
      if Povt(s,SL) then
          begin
          Form2.ComboBox2.Items.Add(dat);
          Form2.ComboBox1.Items.Add(FamName);
          end;
      end;

заменено на
Код

    if nom<>0 then
       begin
       FamName:=copy(s,1,dlin-36);
       dat:=copy(s,nom-19,10);
       if Povt(famName,SL) then
          begin
          Form2.ComboBox1.Items.Add(FamName);
          end;
       if Povt(dat,SL) then
          begin
          Form2.ComboBox2.Items.Add(dat);
          end;
       end;

убрана вторая строка:
Код

AssignFile(f,ExtractFilePath(Application.ExeName)+'Protocol.txt');

и добавлено(исправлено:
Код

if length(s)<>8 then
   s:='0'+s;
writeln(f,Edit1.Text+' '+Edit3.Text+' '+s+' - íà÷àëî ñåàíñà');

т.к. в 0-9 часов получается строка на один символ меньше (к примеру 0:00:01) следовательно в комбобокс у тебя попадало " 25.12.200" это добавление это исправляет...
Добавлено @ 21:29
щяс на мыло скину...

Автор: sacha1m 25.12.2005, 22:06
Albinos_x
Вам ГИГАНСКОЕ спасибо! Расцеловал бы!!!, (в хорошем смысле слова)

Автор: Albinos_x 25.12.2005, 22:30
Рад был помочь smile

Автор: malor 23.5.2007, 15:09
Как можно очистить ComboBox от всех строк в нем, каким методом?

Автор: Rennigth 23.5.2007, 15:19
Код

ComboBox.Items.Clear

 smile 

Автор: Rodman 23.5.2007, 15:39
Код

ComboBox.Clear;

Автор: malor 23.5.2007, 16:03
И тот и другой варианты попробовал, оба работают. Это что, дублирование функций друг друга?

Автор: Rennigth 23.5.2007, 16:07
Цитата(malor @  23.5.2007,  16:03 Найти цитируемый пост)
И тот и другой варианты попробовал, оба работают. Это что, дублирование функций друг друга? 


Метод самого комбобокса Clear вызывает вот это:
Код

  SetTextBuf('');
  FItems.Clear;
  FSaveIndex := -1;


Так что все-таки правельнее будет использовать его.

Автор: malor 23.5.2007, 16:13
Цитата(Rennigth @ 23.5.2007,  16:07)
Код

  SetTextBuf('');
  FItems.Clear;
  FSaveIndex := -1;

Откуда взяты эти строки ?

Автор: Rennigth 23.5.2007, 16:20
Цитата(malor @  23.5.2007,  16:13 Найти цитируемый пост)
Откуда взяты эти строки ? 


эээ, из VCL ... модуль: StdCtrls.pas -> класс: TCustomCombo  -> метод: Clear 

for Delphi 7 строка: 2423  smile  smile  smile 




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)