Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Ответить
 • Просмотры: 1
Аватара пользователя
DillerInc

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение DillerInc »

Savant

Получилось - ну,спасибо!!!

Изображение

Да,кстати,с Наступившим тебя!
Аватара пользователя
Savant

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение Savant »

DillerInc

Да ладно? а если я скажу, что в функции была ошибка, не замеченная мною по случаю Нового Года? Изображение Я тока щас заметил. Кто рабирается в программировании, сразу ее заметит. Правда, я не знаю, как на ошибку среагирует delphi, поскольку нет возможности проверить код в действии.

Перепишу код (и заодно в новом варианте, про который я упоминал):



Код:

Код: Выделить всё

procedure ConvertStr(var sbInp : String);
{Эта кустарная функция должна преобразовывать определённые символы в нужные}
var
  k : Integer;
begin
  k := 1;
  while k < Length( Result ) do begin
    if (sbInp[k] = 'ь') and (sbInp[k+1] = 'l') then begin
      sbInp[k] := 'ы';
      Delete(sbInp,k+1,1);
      end;
    inc(k);
    end;
end; // ConvertStr

Если нужен вариант в виде функции, то можно добавить:



Код:

Код: Выделить всё

function ConvertStrF(const sbInp: String) : String;
begin
  Result := sbInp;
  ConvertStr(Result);
end;
Аватара пользователя
DillerInc

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение DillerInc »

Savant


Цитата:



Да ладно? а если я скажу, что в функции была ошибка



...не знаю,не знаю.Код реализовал,проверил - откомпилированная программа работает исправно.

Если не секрет,то,что за ошибка(для тех,кто с трудом разбирается в программировании Изображение )?
Аватара пользователя
Savant

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение Savant »

DillerInc

Да не секрет конечно...

Обрати внимание - в цикле for предельное значение переменной k является константой начальной длины входной строки, уменьшенной на единицу. А в процессе замены длина строки уменьшается с каждой заменой на 1 (а предельное значение является константой и не уменьшается), поэтому, если в конце обрабатываемой строки будет "ьl" и несколько "ьl" где-то в середине, то возможно в процедуре Delete() или при чтении из Result[k], где k в данный момент времени уже больше Length(Result), возникнет исключение. Но, к счастью, этого не происходит ни там ни там (хотя не очень понятно почему, может наадо включить Overflow Checking?). Ага, я ток что заглянул в справку по Дельфям и прочитал там кое-что интересное насчет Delete() (исключение генерироваться не будет при выходе за пределы строки):


Цитата:



procedure Delete(var S: string; Index, Count: Integer);



Description



In Delphi code, Delete removes a substring of Count characters from string S starting with S[Index]. S is a string-type variable. Index and Count are integer-type expressions.



If index is larger than the length of the string or less than 1, no characters are deleted.




If count specifies more characters than remain starting at the index, Delete removes the rest of the string. If count is less than or equal to 0, no characters are deleted.



Поэтому изначальный код хоть и работает , но имеет некоторые изъяны. Только маленький вопрос напоследок, а Overflow Checking у тебя включен ?



Или Range Checking...
Аватара пользователя
DillerInc

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение DillerInc »

Savant

Огромное спасибо за помощь и советы Изображение .


Цитата:



а Overflow Checking у тебя включен ?



...нет,не включен.Лучше включить?
Аватара пользователя
DillerInc

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение DillerInc »

Чего-то я запутался в следующем:



Код:

Код: Выделить всё

procedure TfmSubRip_Mod.bbOpenClick(Sender: TObject);
{Открываем текстовый файл с титрами}
begin
 OpenDialog1.Filter := 'Титры с расширением "srt"|*.srt';
if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then
   mmOutput.Lines.LoadFromFile(OpenDialog1.FileName);  // Загружаем в многострочное поле текст из файла
   lbOutput.Caption := 'Нажмите "Пуск",чтобы начать исправление символов';  // Добавляем текст в метку

...это всё если OpenDialog1.Execute = True[/i],а мне надо добавить сюда ещё обработчик события OpenDialog1.Execute = False(типа пользователь передумал открывать файл и нажал Cancel),который будет опять добавлять текст в метку,например:



Код:

Код: Выделить всё

lbOutput := 'Повторите операцию "Открыть файл" ';

В общем,попытка добавить в конец вышеуказанного кода слово else вызывает кучу всяких ошибок.Если добавить ещё один условный оператор if...then,то диалоговое окно открытия файла заставляет по два раза открывать нужный файл...
Аватара пользователя
Savant

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение Savant »

DillerInc



Код:

Код: Выделить всё

procedure TfmSubRip_Mod.bbOpenClick(Sender: TObject);
{Открываем текстовый файл с титрами}
begin
  OpenDialog1.Filter := 'Титры с расширением "srt"|*.srt';
  if OpenDialog1.Execute then begin
    if FileExists(OpenDialog1.FileName) then begin
      mmOutput.Lines.LoadFromFile(OpenDialog1.FileName);  // Загружаем в многострочное поле текст из файла
      lbOutput.Caption := 'Нажмите "Пуск",чтобы начать исправление символов';  // Добавляем текст в метку
      end else lbOutput.Caption := 'Файл не найден' end else
    lbOutput.Caption := 'Повторите операцию "Открыть файл" ';
Аватара пользователя
DillerInc

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение DillerInc »

Savant

Ай да Savant - выручатель мой!Действительно получилось,как я хотел.

Спасибо Изображение .
Аватара пользователя
DillerInc

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение DillerInc »

Доброго всем времени суток!

Это снова я...со своими вопросами.А именно,имеется вопрос по использованию переменных в подпрограммах.

Код:



Код:

Код: Выделить всё

unit FileDateU;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, ExtCtrls, Mask;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    bbOpen: TButton;
    OpenDialog1: TOpenDialog;
    Panel2: TPanel;
    lbOutput2: TLabel;
    Panel3: TPanel;
    lbOutput1: TLabel;
    edMaskInput: TMaskEdit;
    bbRun: TBitBtn;
    procedure bbOpenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bbRunClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
 lbOutput2.Caption := 'Нажмите "Открыть",чтобы открыть файл и узнать дату его создания';
end;
procedure TForm1.bbOpenClick(Sender: TObject);
var
 FileHandle : Integer;
 Date : String;
begin
   OpenDialog1.Filter := 'Все файлы|*.*';
if OpenDialog1.Execute then
begin
if FileExists(OpenDialog1.FileName) then
begin
   FileHandle := FileOpen(OpenDialog1.FileName, fmOpenWrite or fmShareDenyNone);
   Date := DateTimeToStr(FileDateToDateTime(FileGetDate(FileHandle)));
   lbOutput1.Caption := Date;
   lbOutput2.Caption := 'Теперь введите новую дату в редактируемое поле и нажмите "OK",чтобы установить новую дату создания файла';
   edMaskInput.SetFocus;
end else
   lbOutput2.Caption := 'Файл не найден'
end else
   lbOutput2.Caption := 'Повторите операцию открытия файла';
end;
procedure TForm1.bbRunClick(Sender: TObject);
var
 Date2 : String;
begin
 Date2 := edMaskInput.Text;
 FileSetDate(FileHandle, (DateTimeToFileDate(StrToDateTime(Date2))));
end;
end.

Вот насчёт переменной



Код:

Код: Выделить всё

var
 FileHandle : Integer;

...мне почему-то не удаётся связать практику с теорией.По теории подпрограмме доступны те переменные,которые были уже объявлены и описаны в предшествующих подпрограммах.Получается,что подпрограмма TForm1.bbRunClick должна видеть переменную,объявленную и описанную в подпрограмме TForm1.bbOpenClick,но при прогоне программы компилятор,проверяя функцию FileSetDate,сообщает об ошибке "Undeclared Identifier"(FileHandle).

Подскажите,пожалуйста,что[/i] я не так понимаю и как можно поправить ситуацию?
Аватара пользователя
Savant

Re: Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Сообщение Savant »

DillerInc
Цитата:



По теории подпрограмме доступны те переменные,которые были уже объявлены и описаны в предшествующих подпрограммах



По теории подпрограмме доступны те переменные, которые объявлены в зоне её видимости. Т.е. глобальные переменные, объявленные вообще вне любой подпрораммы, а также еще в случае, когда одна процедура вложена в другую. Лучше наверно показать на довольно прикольном примере, который ща сочинил:

Код:

Код: Выделить всё

program Project_test;
{$APPTYPE CONSOLE}



Код:

Код: Выделить всё

var TEST: Integer = 5; // объявляем глобальную переменную
procedure a(SUPER: Integer);
// заметим, что переменная SUPER является объявленной локально, 
// т.е. существует только внутри процедуры a; и вложенных в неё
  procedure b;
  begin
	inc( SUPER ); // super = 2+1 = 3
	dec( TEST );  // test = 5-1 = 4 
Ответить

Вернуться в «Программирование и базы данных»