визуальное программирование впервые

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

визуальное программирование впервые

Сообщение castorsky » 18.07.2014 22:00:44

Значит визуальный подход использую в первые в связи с чем есть некоторые вопросы:
1. Объект TComboBox. Например ставлю item по умолчанию, он должен устанавливать переменную как истину, запускаю программу переменная есть ложь.
Код: Выделить всё
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then
     begin
       encrypt := true;
     end
  else
    encrypt := false;
end; 

2. Объект TButton. Как к нему привязать bitmap? Вместо button'ов приходится использовать объект TImage для вызова диалогов.
3. Объект TMemo. Как его масштабировать вместе с родительским окном.
4. Объект TMemo. Если ввести очень длинное слово, то строка не переносится. Как это вылечить?

Ну и в догонку общепаскалевский вопрос. Какой тип данных выбрать для работы с кириллицей (кросс) посимвольно в динамических массивах?
castorsky
незнакомец
 
Сообщения: 6
Зарегистрирован: 03.07.2014 18:07:08

Re: визуальное программирование впервые

Сообщение Vadim » 19.07.2014 04:08:44

1.
castorsky писал(а):Например ставлю item по умолчанию...

- Ну и какое значение Вы поставили по умолчанию? ;-)
- TForm1.ComboBox1Change - это событие наступает в случае изменения данных в ComboBox, а Вы ведь данные, после запуска программы, не меняете, не так ли?
Таким образом, проблема вовсе не в Вашем незнании визуального программирования, а в отсутствии предварительных раздумий с Вашей стороны, над алгоритмом реализации Вашей цели. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: визуальное программирование впервые

Сообщение castorsky » 19.07.2014 12:38:37

Vadim, благодарю Вас. 1 вопрос снят. Но как же быть с остальными?
castorsky
незнакомец
 
Сообщения: 6
Зарегистрирован: 03.07.2014 18:07:08

Re: визуальное программирование впервые

Сообщение *Rik* » 19.07.2014 14:48:24

castorsky писал(а):2. Объект TButton. Как к нему привязать bitmap? Вместо button'ов приходится использовать объект TImage для вызова диалогов.

Я бы по поводу этого вопроса не заморачивался и использовал обычный TButton без иконки. Если уж это так принципиально важно, можете поискать готовый компонент в интернете, когда появится достаточно опыта, напишите свой.
Можно использовать TSpeedButton, но он как и TImage не может получать фокус, а это значит без мыши вы в таком приложении ничего не сможете сделать.

castorsky писал(а):3. Объект TMemo. Как его масштабировать вместе с родительским окном.
4. Объект TMemo. Если ввести очень длинное слово, то строка не переносится. Как это вылечить?

Не пробовали эксперементировать со свойствами Align, Anchors, WordWrap?
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: визуальное программирование впервые

Сообщение castorsky » 19.07.2014 17:29:02

*Rik*, Мил человек, большое тебе человеческое спасибо.
по п.2 есть объект TBitBtn. По п. 3 свойство Anchors.
По поводу WordWrap. Если текст разбит на слова, то всё строки автоматически переносится. Но если ввести длинную последовательность байт, то строка выходит за границу видимости. Впрочем от этого может спасти горизонтальный скрол, но у меня он будет лишним.
castorsky
незнакомец
 
Сообщения: 6
Зарегистрирован: 03.07.2014 18:07:08

Re: визуальное программирование впервые

Сообщение Vadim » 19.07.2014 22:54:32

castorsky писал(а):Но если ввести длинную последовательность байт, то строка выходит за границу видимости.

У TMemo нет возможности делать перенос длинных слов. Вы должны сами делать обработку таких ситуаций. Например, в событии TMemo.OnChange, т.е. при каждом изменении содержимого, измерять длину строки (Length(Memo.Lines.Text)) и если эта длина превышает заданное кол-во байтов, то вставлять пробел (естественно, не забыв поставить WordWrap:=True ;-) ), либо вставлять длинные строки порциями, с помощью Memo.Lines.Add(), тогда будет перенос длинных строк.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: визуальное программирование впервые

Сообщение castorsky » 20.07.2014 03:54:21

Ясно. Дело в том, что я впервые использую паскаль. Не могли бы Вы на примере показать методы посимвольной/побайтной обратотки строк TEdit.Text, TMemo.Lines.GetText. Какие-то сетеры, геттеры Set()/Get(), etc, а то я что-то запутался с типами. Еще момент, я так и не понял индексация массивов идет с 0 или с 1.
castorsky
незнакомец
 
Сообщения: 6
Зарегистрирован: 03.07.2014 18:07:08

Re: визуальное программирование впервые

Сообщение *Rik* » 20.07.2014 11:04:53

castorsky писал(а):Ясно. Дело в том, что я впервые использую паскаль. Не могли бы Вы на примере показать методы посимвольной/побайтной обратотки строк TEdit.Text, TMemo.Lines.GetText. Какие-то сетеры, геттеры Set()/Get(), etc, а то я что-то запутался с типами. Еще момент, я так и не понял индексация массивов идет с 0 или с 1.

При посимвольной обработке строк нужно учитывать, что строки в Lazarus - UTF8 и русские символы занимают несколько байт, поэтому, на мой взгляд, для посимвольной обработки проще преобразовать строку в однобайтную кодировку, например Win1251, затем после обработки преобразовывать обратно в UTF-8.
Код: Выделить всё
uses LConvEncoding;

procedure TForm1.Button1Click(Sender: TObject);
var
  S, AnsiS, C: string;
begin
  S := 'Привет';
  AnsiS := UTF8ToCP1251(S);
  C := AnsiS[3];
  Edit1.Text:= CP1251ToUTF8(C);
end;


Вам нужна литеретура, думаю весь курс паскаля объяснять будет сложно.
Экспресс курс программирования в Lazarus:
http://tuzik87.ru54.com/site/creative/L ... /book.html
к сожалению курс не изобилует примерами....
В дополнение поищите литеретуру по Delphi, для него литературы больше.

Про Get/Set пока не заморачивайтесь, когда будете изучать раздел свойства классов там будет описание.
Статические массивы в паскале могут нумероваться с любого индекса, динамические только с 0. Не путайте со списками, списки всегда индексируются с 0.
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
  AI: array [5..10] of Integer;
  DI: array of Integer;
begin
  AI[5] := 2121;
  SetLength(DI, 10);
  DI[0] := 3434;
  DI[1] := 34343;
  Edit2.Text:= IntToStr(DI[1]);
end;

В этом примере AI - статический массив, DI - динамический и его размерность задается в процессе работы программы, он буде нумероваться всегда с 0.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: визуальное программирование впервые

Сообщение castorsky » 21.07.2014 03:05:54

Спасибо всем откликнувшимся. Хороший тул. А если хорошо владеть языком, то и "боевые" приложения можно писать быстро и просто.
castorsky
незнакомец
 
Сообщения: 6
Зарегистрирован: 03.07.2014 18:07:08

Re: визуальное программирование впервые

Сообщение sign » 21.07.2014 06:03:59

Используйте при работе с текстом функции с utf8 (unit LazUTF8;).

Код: Выделить всё
function BreakLine(const Source: String; aMaxLenght: Integer): String;
var i, k1, k2: Integer;
begin
  k1 := Length(cStr);        // 162 байта в нашем примере. Получим размер в байтах, но это не длина строки в символах. Один символ из русского алфавита в данном случае занимает два байта
  k2 := UTF8Length(cStr);    // 81 символ в нашем примере. Длина строки будет не по количеству байт, а по количеству символов.
  k2 := k2 div aMaxLenght;   // Сколько порций поместится
  k1 := 1;
  Result := '';
  for i := 0 to k2 do begin
    Result := Result + UTF8Copy(Source, k1, aMaxLenght) + ' ';
    Inc(k1, aMaxLenght);
  end;
end;

procedure TfTest.Button1Click(Sender: TObject);
const cStr = 'ОчентОченьДлиннаяСтрокаКоторуюПоМоимРелигиознымПравиламНикакНиззяРазбиватьНаСлова';
begin
  Memo1.Text := BreakLine(cStr, 30);
end;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: визуальное программирование впервые

Сообщение castorsky » 21.07.2014 18:06:39

Собрал в linux. Нареканий нет (надо будет еще через valgrind прогнать). Собрал в win 7 x64_86. Появились проблемы. Lazarus 1.2.4, fpc 2.6.4. Ошибки работы с памятью, хотя явной работы с памятью в приложении нет. Срин прилагаю, код программы прилагаю. Кроме того после шифрования/дешифрования появляются дополнительные символы. Это скорее всего связано с тем что я не знаю как правильно осуществлять доступ к символам строк по индексу. Постановка задачи: реализовать многоалфавитный метод шифрования.
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, SynMemo, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ActnList, Menus, PopupNotifier, ExtCtrls, Buttons, LConvEncoding;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ComboBox1: TComboBox;
    Edit1: TEdit;
    Go: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Edit1OnClick(Sender: TObject);
    procedure GoClick(Sender: TObject);
    procedure MainChange(Sender: TObject; Source: TMenuItem; Rebuild: Boolean);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  Encrypt: boolean = true;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.MainChange(Sender: TObject; Source: TMenuItem; Rebuild: Boolean
  );
begin

end;

// функция проверки ключа на валидность. Исключает все символы из строки,
// кроме цифр.
function ValidateKey(Key: String; Length : integer) : String;
var
  ValidKey : String = '';
  CompStr : String = '09';
  Index : integer = 1;
  Len : integer = 1;
begin
   while Index <= Length do begin
     if (Ord(Key[Index]) >= Ord(CompStr[1]))
     and (Ord(Key[Index]) <= Ord(CompStr[2])) then
     begin
       ValidKey := ValidKey + Key[Index];
       inc(Len);
     end;
     inc(Index);
   end;
   ValidateKey := ValidKey;
end;

// функция шифрования/дешифрования данных.
// Buf -- данные, которые шифруются/дешифруются
// Key -- ключ
// Crypt -- флаг, с помощью которого определяем какую манипуляцию производить
// с данными
function DataCrypt(Buf : String; Key : String; Crypt : boolean) : String;
var
  CryptBuf : String = '';
  KeyLen : integer;
  BufLen : integer;
  KeyIndex : integer = 1;
  BufIndex : integer = 1;
  Offset : integer;
begin
   BufLen := Length(Buf);
   KeyLen := Length(Key);

   if KeyLen <> 0 then begin
     while BufIndex < BufLen do begin
     KeyIndex := 1;

       while (KeyIndex <= KeyLen) and (BufIndex < BufLen) do begin
         Offset := Ord(Key[KeyIndex]) - Ord('0');
         if Crypt then begin
           CryptBuf := CryptBuf + Chr(Ord(Buf[BufIndex]) + Offset);
         end
         else begin
           CryptBuf := CryptBuf + Chr(Ord(Buf[BufIndex]) - Offset);
         end;
         inc(BufIndex);
         inc(KeyIndex);
       end;
     end;
     DataCrypt := CryptBuf;
   end
   else begin
     DataCrypt := Buf;
   end;
end;

// процедура обработки кнопки Go
procedure TForm1.GoClick(Sender: TObject);
var
  KeyStr : String;
  DataStr: String;
begin
   KeyStr := Edit1.Text;
   KeyStr := ValidateKey(KeyStr, Length(KeyStr));
   DataStr := DataCrypt(UTF8ToCP1251(Memo1.Lines.Text),
              UTF8ToCP1251(KeyStr), Encrypt);
   Memo1.Lines.Clear;
   Memo1.Lines.Add(CP1251ToUTF8(DataStr));
end;

// процедура обартотки компонента Combobox.
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then begin
    Encrypt := true;
  end
  else begin
    Encrypt := false;
  end;
end;

// обработка открытия файла
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    Memo1.Lines.Clear;
    Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
     begin
       Memo1.Lines.SaveToFile(SaveDialog1.FileName);
     end;
end;

// обработка сохранения файла
procedure TForm1.Edit1OnClick(Sender: TObject);
begin
  Edit1.Text := '';
  Edit1.Font.Color := clDefault;
end;

end.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
castorsky
незнакомец
 
Сообщения: 6
Зарегистрирован: 03.07.2014 18:07:08


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 210

Рейтинг@Mail.ru