Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание множества форм от одной формы, Вывод множества сообщений  
:(
    Опции темы
CasperSC
Дата 28.11.2009, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Программа запускает сообщение на экран при срабатывании "будильника", мне надо, чтобы форма создавалась независимо от других созданных ранее форм (сообщение, это форма с компонентами для вывода сообщения). У меня стоят 3 таймера на одно и тоже время создаются 3 формы, одну закрываю, вторая начинает глючить, не происходит, то что запрограммировано на событии OnPaint, да и вообще похоже не правильно это я делаю. Вот код: Как сделать правильно?


Код

procedure TForm1.TimerAlarmsTimer(Sender: TObject);
var I : integer;
begin
  DateTimeNow := Now;
  DecodeDate(DateTimeNow, YearNow, MonthNow, DayNow);
  DecodeTime(DateTimeNow, HourNow, MinNow, SecNow, MilSecNow);
  for I := 0 to (ListViewAlarm.Items.Count - 1) {Alarms.Count - 1} do
  begin
   if TClock(ListViewAlarm.Items.Item[i].Data).CheckTime then 
   //Если время совпало, то...
   begin
     if MP.Mode = mpPlaying then 
     //медиа плэйер, если играет от предыдущей созданной этим же кодом формы, то стоп...
     begin
       MP.Stop;
       MP.Close;
     end;
     FormMessage := TFormMessage.Create(Self); [color=green] 
     //Надо, чтобы было можно создать много форм и они не глючили[/color]
     FormMessage.CreateMessage(TClock(ListViewAlarm.Items.Item[i].Data),
       ListViewAlarm.Items.Item[I]); 
     //передаю в качестве параметров, будильник и строку в ListView под удаление,
     //если будильник в режиме срабатывания "Один раз"
     FormMessage.Show;
   end;
  end;
end;





Это сообщение отредактировал(а) bems - 30.11.2009, 07:40
PM MAIL   Вверх
sCreator
Дата 28.11.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: 2
Всего: 5



Не присваивайте их одной глобальной переменной ( FormMessage  ).

Сделайте ее локальной
Код

procedure TForm1.TimerAlarmsTimer(Sender: TObject);
var I : integer;
     FormMessage  : TFormMessage;

а глобальную уберите. ( соответственно уберите использование глобальной переменной в методах самой формы ( можно использовать Self ) и других модулях.
Если нужно к ним обращаться, то можно найти через Form1.Components или собирать в список.
PM   Вверх
Akella
  Дата 28.11.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



CasperSC, делается это так
1. Удаляем глобальную переменную из раздела VAR модуля формы
2. В закрытии формы пишем код
Код

  action := caFree;
  TForm1 := nil;


3. В модуле формы создаём процедуру, примерно такую
Код

procedure CallEditApart(ID:integer;AEditMode:Boolean;iBaseType:Integer);
begin
  with TForm1.Create(Application) do
  begin
   
   //что-то можно сделать до показа формы

//показываем форму
   Show;

  end;//with
end;


Вызов из других модулей:
Код

//например, на кнопку вешаем обработчик  
  CallEditApart(10, True, 5);

PM MAIL   Вверх
CasperSC
Дата 28.11.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Я зделал так и всё получилось, это модуль формы сообщения, а вызывается из главной формы:
Модуль ещё не доработан, так что пока всё убого )

Код

unit AlarmMessageUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, MPlayer, Buttons, MMSystem, ComCtrls, SettingUnit;

type
  TFormMessage = class(TForm)
    MemoMessage: TMemo;
    SpeedButton1: TSpeedButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormPaint(Sender: TObject);


  private
    { Private declarations }
  public
    procedure CreateMessage(Alarm : TClock; IndexList : TListItem);
    { Public declarations }
  end;

var
  FormMessage: TFormMessage;
  ReserveVol : LongWord;
  
implementation

uses NewAlarmClock;



{$R *.dfm}





procedure TFormMessage.CreateMessage(Alarm : TClock; IndexList : TListItem);
begin
  if Alarm.FModeMessage = MINI_1 then
  begin
    ReserveVol := 0;
    Self.Width := 255;
    Self.Height := 222;

    Self.MemoMessage.Color := Alarm.FAppearanceMsg.ColorBackground;
    Self.Color := Alarm.FAppearanceMsg.ColorBackground;
    Self.AlphaBlendValue := Alarm.FAppearanceMsg.AlphaBlendValue;
    Self.MemoMessage.Font.Name := Alarm.FAppearanceMsg.FontText;
    Self.MemoMessage.Font.Color := Alarm.FAppearanceMsg.FontColor;
    Self.MemoMessage.Font.Size := Alarm.FAppearanceMsg.FontSize;

    Self.MemoMessage.Clear;
    Self.MemoMessage.Text := Alarm.FTextMessage;

    if Alarm.FMusicEnabled then //если воспроизведение музыки выбрано, то...
    begin
      Form1.MP.FileName := Alarm.FMusicWay;
      Form1.MP.Open;
      Form1.MP.Play;
    end;

    if Alarm.FChangeSound then //если изменение громкости выбрано, то...
    begin
      ReserveVol := FormNewClock.GetVolume;
      waveOutSetVolume(WAVE_MAPPER,Alarm.FVolume);
    end;
  end;
end;


procedure TFormMessage.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.CountMsgForms := Form1.CountMsgForms - 1;
  if not Form1.MsgFormsExists then
  begin
    Form1.TimerAlarms.Enabled := False;
    Form1.TimerMsgFormExists.Enabled := True;
  end;
end;

procedure TFormMessage.FormCreate(Sender: TObject);
begin
  Form1.CountMsgForms := Form1.CountMsgForms + 1; //количество созданных форм, думал поможет в одном вопросе... не помогло.
end;

procedure TFormMessage.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION,0);
end;

procedure TFormMessage.FormPaint(Sender: TObject);
var p : TPoint;
begin
  p.X := 0;
  p.Y := 32;
  Self.Canvas.Rectangle(0, 0, Self.Width, Self.Height);
  Self.Canvas.PenPos := p;
  Self.Canvas.Pen.Color := clBlack;
  Self.Canvas.Pen.Style := psDot;
  Self.Canvas.LineTo(Self.Width, 32);
end;


procedure TFormMessage.SpeedButton1Click(Sender: TObject);
var
  I: Integer;
  M : array of integer;
begin
  Form1.TimerAlarms.Enabled := False;
  if Form1.MP.Mode = mpPlaying then
  begin
   Form1.MP.Stop;
   Form1.MP.Close;
  end;
  if ReserveVol <> 0 then
  begin
    waveOutSetVolume(WAVE_MAPPER, ReserveVol);
  end;
  Self.Close; 
end;

end.


Вот что я поменял в главной форме:
Код

procedure TForm1.TimerAlarmsTimer(Sender: TObject);
var I : integer;
begin
  DateTimeNow := Now;
  DecodeDate(DateTimeNow, YearNow, MonthNow, DayNow);
  DecodeTime(DateTimeNow, HourNow, MinNow, SecNow, MilSecNow);
  for I := 0 to (ListViewAlarm.Items.Count - 1) do
  begin
   if TClock(ListViewAlarm.Items.Item[I].Data).CheckTime then
   begin
     if MP.Mode = mpPlaying then
     begin
       MP.Stop;
       MP.Close;
     end;
    try
     FormMsg := TFormMessage.Create(Application.MainForm);                                                               //Тут поменял
     FormMsg.CreateMessage(TClock(ListViewAlarm.Items.Item[I].Data), ListViewAlarm.Items.Item[I]); //Тут поменял
     FormMsg.Show;                                                                                                                                  //Тут поменял
    except
     ShowMessage('При создании формы сообщения произошла ошибка');
    end;
   end;
  end;
end;


переменную FormMsg объявил в главном модуле, но оказывается проблемы были из-за самого модуля сообщения, там где сейчас написано Self, было FormMessage, вот так решил проблему
PM MAIL   Вверх
Akella
Дата 28.11.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Что-то я не могу найти, как ты освобождаешь ресурсы после закрытия TFormMessage
PM MAIL   Вверх
CasperSC
Дата 28.11.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Цитата(Akella @ 28.11.2009,  17:36)
Что-то я не могу найти, как ты освобождаешь ресурсы после закрытия TFormMessage

И правда!  Может надо дописать после Self.Close, Self.Free; ?

P.S. Akella помогите пожалуйста в этом вопросе, я уже не знаю, что делать, что только не пробовал не получается, на 4 форумах спрашивал, никто не отвечает, могу даже эксэшник выложить, чтобы наглядно показать проблему - Вопрос по удалению будильника из списка

Это сообщение отредактировал(а) CasperSC - 28.11.2009, 18:44
PM MAIL   Вверх
sCreator
Дата 28.11.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

Репутация: 2
Всего: 5



CasperSC,  честно говоря, немного грустно, особенно если выложите "эксэшник" ( декомпилировать не собираюсь ) - лучше исходники, чтобы можно было загрузить в Delphi и немного посмотреть.
PM   Вверх
CasperSC
Дата 29.11.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Всем спасибо за помощ, вопрос уже решил сам, оказалось надо было при нахождении одноразового будильника прерывать цикл проверки будильников на срабатывание, а не останавливать таймер.
Код

...
for I := 0 to (ListViewAlarm.Items.Count - 1)  do
  begin
   if TClock(ListViewAlarm.Items.Item[i].Data).CheckTime then 
...
break //вот так


Но это уже другая тема
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.