Крымский форум (Crimea-Board) Поиск Участники Помощь Текстовая версия Crimea-Board.Net
Здравствуйте Гость .:: Вход :: Регистрация ::. .:: Выслать повторно письмо для активации  
 
> Рекламный блок.
 

Реклама на форуме

 
> Ваша реклама, здесь
 
 
 

  Start new topic Start Poll 

> Кто знает Delphi,, нужна помощь
Denni | Профиль
Дата 17 Февраля, 2010, 13:56
Quote Post




Group Icon

Группа: Silver Member
Сообщений: 704
Регистрация: 15.01.07
Авторитет: 1
Вне форума

Предупреждения:
(0%) -----


Суть: есть файл с набором цифр(цифры записаны каждое с новой строки). Есть программка, которая выбирает из определенного диапазона рандомное число и, если его нет в файле, то записывать его туда, а если есть - то выдавать окно с сообщением. Программка есть, проблема с проверкой на наличие числа в файле. Бьюсь 2-ой день.
Код

procedure TForm1.Button1Click(Sender: TObject);
const n = 999999;
var
r1 : integer;  
r2 : integer;
r3 : integer;
f : TextFile;
s : string;
begin
 Randomize;
 r1:=StrToInt(Edit3.Text); - нижнее значение
 r2:=StrToInt(Edit4.Text); - верхнее значение

if ((r1 < 0) or (r2 > n)) then ShowMessage('Бла-бла-бла');
else
  begin
   r3:= RandomRange(r1,r2);
   Edit2.Text:=IntToStr(r3); - отображение числа
  end;

s:=Edit2.Text;
AssignFile(f,'file.txt');

 While not (EoF(f)) do
  begin
    Readln(f,s);
    if Pos(f,s)>0 then
      begin
        ShowMessage('Record Find');
        Edit2.Clear;
      end
          else
            begin
              Append(f);
              Writeln(f,s);
            end;
  end;
CloseFile(f);

end;



____________________
я постоянно учусь...
PMEmail Poster
1/3062   
Бобер | Бездомный
Реклама двигатель прогресса       
Quote Post



А кому сча лехко?
Group Icon
















_________________
Желающим разместить рекламу смотреть сюдой
/   
Пэтро |
Дата 17 Февраля, 2010, 14:42
Quote Post



Unregistered









Процедура какой-то кошмар..


Цитата
s:=Edit2.Text;


Зачем переменную брать из строки если она уже есть?
Цитата
r3


Цитата
Readln(f,s);
Взять строку в переменную s ????
Цитата
if Pos(f,s)>0 then
Если строка присутствует в файле? ДЫк конечно присутствует, вы же только что ее взяли...
Цитата
ShowMessage('Record Find');
Конечно файнд.

Вместо
Цитата
While not (EoF(f)) do
  begin
    Readln(f,s);
    if Pos(f,s)>0 then
      begin
        ShowMessage('Record Find');
        Edit2.Clear;
      end


Надо чтото типа
Код

While not (EoF(f)) do
 begin
   Readln(f,[b]x[/b]);
   if x=r3 then
     begin
       ShowMessage('Record Find');
       Edit2.Clear;
     end
Denni | Профиль
Дата 17 Февраля, 2010, 15:26
Quote Post




Group Icon

Группа: Silver Member
Сообщений: 704
Регистрация: 15.01.07
Авторитет: 1
Вне форума

Предупреждения:
(0%) -----


ошибка I/O Error 104


____________________
я постоянно учусь...
PMEmail Poster
Пэтро |
Дата 17 Февраля, 2010, 15:41
Quote Post



Unregistered









Denni
я же приблизительно написал...

кроме того после
Код
AssignFile(f,'file.txt');

надо

Код
ReadFile(f);
Denni | Профиль
Дата 17 Февраля, 2010, 18:03
Quote Post




Group Icon

Группа: Silver Member
Сообщений: 704
Регистрация: 15.01.07
Авторитет: 1
Вне форума

Предупреждения:
(0%) -----


все... решилось...
Пэтро, спасибо за советы)))

вот код, если кому надо, может он не очень хороший, но рабочий:
Код

procedure TForm1.Button1Click(Sender: TObject);
const n = 999999;
var
r1 : integer;  
r2 : integer;  
r3 : integer;  
f : TextFile;
s, s1 : string;
IsFound : Boolean;
begin
 Randomize;
 r1:=StrToInt(Edit3.Text);
 r2:=StrToInt(Edit4.Text);

if ((r1 < 0) or (r2 > n)) then ShowMessage('Бла-Бла-Бла');
 else begin
   r3:= RandomRange(r1,r2);
   Edit2.Text:=IntToStr(r3);
  end;

s1 := Edit2.Text;

AssignFile(f, 'ungame.txt');
Reset(f);
 IsFound := False;
 while not Eof(f) do begin
   Readln(f, s);
   if Pos(s1, s) > 0 then begin
     ShowMessage('Record Find');
     IsFound := True;
     Edit2.Clear;
     Break;
   end;
 end;

 if not IsFound then begin
   Append(f);
   Writeln(f);
   Write(f, s1);
 end;

 CloseFile(f);
end;


Отредактировал Denni - 17 Февраля, 2010, 18:04


____________________
я постоянно учусь...
PMEmail Poster
1/3062   
gccrim | Профиль
Дата 17 Февраля, 2010, 18:47
Quote Post




Group Icon

Группа: Silver Member
Сообщений: 850
Регистрация: 02.07.06
Авторитет: 3
Вне форума

Предупреждения:
(0%) -----


Denni, только есть в твоей проге один глюк. Если в файле будет число 1234, а ты ищешь 23, то твоя прога ответит что такое число есть, хотя на самом деле его нет.
PMEmail Poster
Denni | Профиль
Дата 17 Февраля, 2010, 21:17
Quote Post




Group Icon

Группа: Silver Member
Сообщений: 704
Регистрация: 15.01.07
Авторитет: 1
Вне форума

Предупреждения:
(0%) -----


почему?


____________________
я постоянно учусь...
PMEmail Poster
Rashid |
Дата 17 Февраля, 2010, 21:42
Quote Post



Unregistered









Цитата(Denni @ 17 Февраля, 2010, 19:17)
почему?

Потому что
Код
if Pos(s1, s) > 0 then begin

Вернет для указанного случая
Цитата(gccrim @ 17 Февраля, 2010, 16:47)
Если в файле будет число 1234, а ты ищешь 23

позицию больше нуля.

Например, если в строке с самого начала идет число 1234 (s = "1234"), то
Pos( "23", "1234" ) будет равно 2, т.е. > 0.

Получается, что в файле как будто есть число 23, хотя там есть только 1234.

Что мешает просто написать:
Код

  if ( s1 = s ) then begin
    ShowMessage('Record Find');
    IsFound := True;
    Edit2.Clear;
    Break;
  end;


?
Denni | Профиль
Дата 18 Февраля, 2010, 13:06
Quote Post




Group Icon

Группа: Silver Member
Сообщений: 704
Регистрация: 15.01.07
Авторитет: 1
Вне форума

Предупреждения:
(0%) -----


а мешает отсутствие навыков и опыта =)
Спасибо =)


____________________
я постоянно учусь...
PMEmail Poster
Пэтро |
Дата 18 Февраля, 2010, 14:28
Quote Post



Unregistered









Причем я об этом писал в самом начале...


Все таки я не пойму как ты читаешь файл без ReadFile(f); ассоциировать файл с переменной недостаточно, надо его еще открыть. или нынче AssignFile выполняет 2 функции?
Rashid |
Дата 18 Февраля, 2010, 16:36
Quote Post



Unregistered









Цитата(Пэтро @ 18 Февраля, 2010, 12:28)
Все таки я не пойму как ты читаешь файл без ReadFile(f); ассоциировать файл с переменной недостаточно, надо его еще открыть. или нынче AssignFile выполняет 2 функции?

У него есть Reset( f ) и Append( f ) - этого вполне достаточно. Первое - открывает уже существующий файл для чтения, второе - открывает существующий файл для дописывания.

А само чтение осуществляется через Readln( f, s ).

Так что здесь все так, как и должно быть.

P.S. Вы, наверное, путаете с набором функций: FileOpen, FileRead.
1/   

Topic Options Start new topic Start Poll 

 



[ Script Execution time: 0.0121 ]   [ 12 queries used ]   [ GZIP включён ]






Политика конфиденциальности

Top