Вопросы новичка

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

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

Re: FAQ Lazarus

Сообщение kipar » 04.05.2011 13:48:30

>Fatal: Синтаксическая ошибка: ожидается "BEGIN", но нашли "end of file"
У меня это сообщение выводится во всех модулях, содержащих
Код: Выделить всё
initialization
...
end.

Причем ошибка именно в Lazarus, т.к. компилируется все нормально, а вот при попытке использовать автозавершение и прочие удобства среды вылезает ошибка.
Пробовал и в svn билдах и в 0.9.30.
Лечится заменой секции инициализации на
Код: Выделить всё
begin
...
end.
(хотя это, вроде бы, устаревший стиль)
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

Re: FAQ Lazarus

Сообщение Mishuila » 21.05.2011 20:17:26

Ситуация такова: у меня есть кнопка, радиогруппа с семью радиокнопками, и есть шесть эдитов. Нужно сделать так, чтобы при выборе одной из радиокнопок, и при нажатии на кнопке в каждом эдите появилось определённое число (все числа не больше 12). Вот как я это написал:

Код: Выделить всё
procedure TForm4.Button1Click(Sender: TObject);
var
  a,b,c,d,e,f:integer;
begin
If RadioGroup1.ItemIndex=0 then begin a:=8; b:=1; c:=5; d:=10; e:=3; f:=8; end;
If RadioGroup1.ItemIndex=1 then begin a:=10; b:=3; c:=7; d:=0; e:=5; f:=10; end;
If RadioGroup1.ItemIndex=2 then begin a:=0; b:=5; c:=9; d:=2; e:=7; f:=0; end;
If RadioGroup1.ItemIndex=3 then begin a:=1; b:=6; c:=10; d:=3; e:=8; f:=1; end;
If RadioGroup1.ItemIndex=4 then begin a:=3; b:=8; c:=0; d:=5; e:=10; f:=3; end;
If RadioGroup1.ItemIndex=5 then begin a:=5; b:=10; c:=2; d:=7; e:=0; f:=5; end;
If RadioGroup1.ItemIndex=6 then begin a:=7; b:=0; c:=4; d:=9; e:=2; f:=7; end;
Edit1.text:=Inttostr (a);
Edit2.text:=Inttostr (b);
Edit3.text:=Inttostr (c);
Edit4.text:=Inttostr (d);
Edit5.text:=Inttostr (e);
Edit6.text:=Inttostr (f);
end;


но вместо этих чисел, он выдаёт либо ноль там где не надо либо трёхзначные числа и больше. Не знаю что делать
Mishuila
незнакомец
 
Сообщения: 1
Зарегистрирован: 21.05.2011 20:06:17

Re: FAQ Lazarus

Сообщение Nik » 21.05.2011 21:12:54

2Mishuila
Ваш код вполне рабочий. Нужно только избавиться от индусских мотивов. Хотя бы так:

Код: Выделить всё
case RadioGroup1.ItemIndex=0 of
0: begin a:=8; b:=1; c:=5; d:=10; e:=3; f:=8; end;
1: begin a:=10; b:=3; c:=7; d:=0; e:=5; f:=10; end;
// ...
end;


Рабочий пример - во вложении.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: FAQ Lazarus

Сообщение Maxizar » 21.05.2011 21:23:17

Mishuila а если честно это что за КОД???? мне даже интересно.... :D
Вот решение:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    RadioGroup1: TRadioGroup;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    Procedure Proc1(a,b,c,d,e,f:Integer);
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
     0: Proc1(8,1,5,10,3,8);
     1: Proc1(10,3,7,0,5,10);
     2: Proc1(0,5,9,2,7,0);
     3: Proc1(1,6,10,3,8,1);
     4: Proc1(3,8,0,5,10,3);
     5: Proc1(5,10,2,7,0,5);
     6: Proc1(7,0,4,9,2,7);
  else
     Proc1(0,0,0,0,0,0);
  end;

  //Caption := IntToStr(RadioGroup1.ItemIndex);
end;

procedure TForm1.Proc1(a, b, c, d, e, f: Integer);
begin
  Edit1.text:=Inttostr(a);
  Edit2.text:=Inttostr(b);
  Edit3.text:=Inttostr(c);
  Edit4.text:=Inttostr(d);
  Edit5.text:=Inttostr(e);
  Edit6.text:=Inttostr(f);
end;

end.



Предвижу ответ у меня ни чего не работает, Так что:
1. Обновитесь до 0.9.30.
2. Скомпильте мой проект, должно все работать.... ну и если так не будет, я бессилен :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: FAQ Lazarus

Сообщение Nik » 21.05.2011 22:01:03

а если честно это что за КОД???? мне даже интересно....

Подозреваю, коллега, что мы решаем школьную задачку или пишем лабу для первого курса :)

Добьём индусский код. Вот ещё один вариант (без лишних переменных и портянок с case и обращениями к каждому Edit'у персонально):

Код: Выделить всё
const
  nums: array[0..6, 0..5] of integer =  (  (8,1,5,10,3,8), (10,3,7,0,5,10), (0,5,9,2,7,0), (1,6,10,3,8,1), (3,8,0,5,10,3), (5,10,2,7,0,5), (7,0,4,9,2,7)  );

// [...]

procedure TForm1.Button1Click(Sender: TObject);
begin
SetNums(nums[RadioGroup1.ItemIndex]);
end;

procedure TForm1.SetNums(nums: array of integer);
var
i: integer;
begin
  with Panel1 do
   for i:=0 to ControlCount-1
    do (Controls[i] as TEdit).Text:=IntToStr(nums[i]);
end; 


Рабочий пример - в аттаче :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: FAQ Lazarus

Сообщение Leon » 23.05.2011 16:47:36

Ребята,здравствуйте.
Посоветуйте,пожалуйста,кто-нить как организовать вызов другой формы с первой.Я вот что делаю.
1.Завожу новый проект.Его форма и будет у меня главной,другие все ей должны подчиняться.
2.Пишу необходимый набор процедур и функций для первой формы.Одна из кнопочек в форме1 по клику должна вызывать появление другой формы.
3.Щелкаю в панели инструментов на "Новую форму",открывается новый модуль Unit2 с новой формой.Прописываю в нем
процедуры работы с этой формой.
4.В список uses модуля первой формы добавляю Unit2.
5.В клике кнопки вызова в первой форме пишу Form2.Show; И ничего... Компилятор отвечает,что не знает такого объекта как Form2.Что я сделал не так?
Спасибо.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: FAQ Lazarus

Сообщение Maxizar » 23.05.2011 17:07:58

Leon хм вроде все правильно делаете, может че с путями или чем нибудь еще...
Хотя возможно нужно написать более конкретно:
Код: Выделить всё
Unit2.Form2.Show;

вот прикладываю свой вариант, вызываю форму, при чем передаю ей параметр (строку) аля пароль, та его проверяет и мол говорит пароль верен или нет... Отличие может быть, только в том, что я создаю форму, тоесть по умолчанию у меня эти формы сразу при старте программы не создаются.. а так все тоже самое:

Если не будет компилится или чень в этом роде, обновитесь до Lazarus 0.9.30
Если и так не будет, то нужны будут исходники и более детальная инфа о Системе, лазарусе и т.п.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: FAQ Lazarus

Сообщение Leon » 24.05.2011 10:31:55

Спасибо,Maxizar,за ответ.Делал я так и с указанием на юнит2.Матерится не менее предыдущего.Я,конечно,выкрутился.Огранизовал эту вторую форму как отдельный проект,откомпилировал,обработал утилитами,укрощающими страсти и из файла в 12,5 МБ получился файл аж 500КБ! Ну и накрутки же у Лазаруса!!!
Потом эту вторую форму подключил к первой как вызов внешнего ЕХЕ файла.И все пошло
Вам за пример спасибо.Попробую разобраться вечером.Для науки будет.И заодно скачаю себе более модерный Лазарус.
Кстати мне в сети попадался альтернативный проект "Алгоритм".Кто что об этом думает,выскажитесь,плиз.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: FAQ Lazarus

Сообщение Maxizar » 24.05.2011 10:58:32

Leon Я конечно все понимаю, но ваше решение, это полная .... не честно. Вы придумали такие грабли что просто жуть.... ТАК никто не делает... Но а если и делает, то для взлома программ (чужих) когда программа Кряка запускает нужное окно и уходит на упокой... Вы же делать будите так всегда да и еще в своем родном приложении... Просто еще разок прочитайте в любой книге хоть по Delphi, хоть по Lazarus как работать с формами. Мы же ведь как то с ними работаем :D и все просто отлично... Сама среда Lazarus написана с использованием Free Pascal значит все работает!

Потом 12 Метров, Вот так и знал

Leon - Lazarus использует для отладки отладчик GDB, для работы которого нужна отладочная информация , вот она и занимает 10-15 метров в вашем приложении, ее можно удалить при помощи программы Strip, и потом, после того как приложение готово = релиз, скомпилировать нужно его с ключем оптимизации -O2 или выше.. я делаю с -O2. Потому что тем самым вы удалите все лишние Push на стеке... более подробно это обсуждалось тут, я там кстати и листинги показывающие разницу привел.. там же прочитайте сообщения Сергея Горелкина, их нужно прочитать как минимум два раза, для пущего понимания...

А про 500КБ значит использовали UPX, я не хочу вас переманивать на свою сторону (не любителей UPX, когда в нем нет никакой необходимости), потому что необходимость в нем нужна лишь в 5% случаев. Подробно можно все обсуждения просмотреть в этой ветке
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: FAQ Lazarus

Сообщение Leon » 25.05.2011 19:17:34

Maxizar,спасибо за подробный ответ.Термины,правда,выше моего понимания... А форму2 я сделал отдельным ЕХЕшником по безвыходности.Задача есть,решать надо,а подсказать некому.Вот и выкрутился.Как грицца:"мой дядя самых лучших правил..." :D

Подскажите,пожалуйста,новый Лазарус ставить поверх старого или старый перед тем снести?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: FAQ Lazarus

Сообщение Leon » 02.06.2011 01:03:47

Оба-на! Скачал я этот 30-й лазарус.Старый 28-й снес.Запустил... И мои старые проекты сдохли... Компилятору нехватает каких-то Юнитов,которые в старой версии были,а в новой,видать,испарились,что-ли? И что же мне теперь делать-то? Возвращаться к стилю ретро-лазарус? Или все-таки есть выход?
Кстати,Maxizar,Ваши примеры с формами также не пошли из-за этих самых злочасных юнитов,которых почему-то в новой сборке нет.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: FAQ Lazarus

Сообщение Nik » 02.06.2011 10:02:31

2Leon
Что за юниты-то? Выложите пример сообщения об ошибке, которое компилятор выдаёт.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: FAQ Lazarus

Сообщение Maxizar » 02.06.2011 10:37:17

Leon - хм... вот если бы вы запускали проекты (0.9.28) в 0.9.30 и выше, то да!! это из-за того, что столько воды утекло. И причина могла быть в том, что новый лазарус использует новый файл ресурсов подробнее тут (http://lazarus-dev.blogspot.com/2010/02/work-on-0930-changes-in-resource.html)
Но мой проект собран вроде как раз в 30-ке, по этому проблема не понятна... Если у вас еще Windows XP. то я сдаюсь, у меня после переустановки лазаруса вообще никаких проблем, может у меня просто правильная Windows XP... :shock:
Если вы под Linux-ом, то тут я не советчик :evil:
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: FAQ Lazarus

Сообщение Leon » 02.06.2011 11:26:41

Здравствуйте всем!
Отчитываюсь о "достижениях".
1.По проекту "Формы" от Maxizar

Участок кода такой:

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1//, Unit2
{ you can add units after this };


При запуске выдает
project1.lpr(1,1) Fatal: Can't find unit Interfaces used by project1

Теперь один из моих проектов

Код:

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1, LResources;

При запуске:
project1.lpr(1,1) Fatal: Can't find unit Interfaces used by project1

Иду на "извращения".Ссылку на модуль Interfaces выбрасываю.Запускаю.
Появляется ругающееся окно с укоризной как же я себе позволил такое - выбросил ссылку на Interfaces.Он же нужен! И
предлагает исправить код.Соглашаюсь.Interfaces появляется после LResources.Запускаю.И снова... см.выше... :shock:

Снова выбрасываю интерфейсы,на корректировку не соглашаюсь.Запускаю.И снова выдает
project1.lpr(1,1) Fatal: Can't find unit Forms used by project1

Дальше чистить ссылки бесполезно.То же самое напишет и для очередного "оставшегося в живых" модуля.

Справка по моей системе
Виндоуз у меня стоит 7-й (на второй машине ХР).Но версия 28 исправно работала и на той,и на другой.Тридцатая барахлит на обоих... Виндоузы "общенародные",но на работу их жалоб нет.

Список путей в настройках лазаруса
Путь установки C:\lazarus\
путь к компилятору C:\lazarus\fpc\2.2.4\bin\i386-win32\fpc.exe
путь к Маке C:\lazarus\fpc\2.2.4\bin\i386-win32\fpcmake.exe
путь для временных проектов C:\Users\-1494~1\AppData\Local\Temp\
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: FAQ Lazarus

Сообщение Brainenjii » 02.06.2011 11:55:38

Откройте инспектор проекта (Проект -> Инспектор проекта) - убедитесь, что в зависимостях указан пакет LCL (LCLbase и подобное - удалить). Попробуйте собрать проект. Если не удалось, то:
  • если удалялся только сам лазарус, то на всякий случай почистите конфигурационные файлы (%USERPROFILE/Local Settings/Application Data/Lazarus/*);
  • пересоберите Lazarus, установите необходимые пакеты;
  • попробуйте создать и собрать новый проект;
  • Откройте инспектор проекта (Проект -> Инспектор проекта) - убедитесь, что в зависимостях указан пакет LCL (LCLbase и подобное - удалить).
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru