Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2017, 19:32   #1
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию Объединение двух Unit DELPHI

Ребята. Нужна помощь. Смотрите, у меня два юнита. Один с потоками другой обычный. Я вроде как правильно указал, в uses и там и там. В юните2 не видит ListBox и DateTimePicker, что делать? Может быть код сам по себе плохо написан или дело в другом?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls,spin,Unit2;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    GroupBox2: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ListBox1: TListBox;
    DateTimePicker1: TDateTimePicker;
    DateTimePicker2: TDateTimePicker;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Thread: array of MyPotok;
implementation
   {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
    i, j, n, a1, b1:integer;
  begin
    a1:=b1+1;
    b1:=b1+n;
    SetLength(Thread,i+1);
    Thread[i]:=MyPotok.Create(True); //ýêçåìïëÿð ïîòîêà
    Thread[i].a:=a1;
    Thread[i].b:=b1;
    Thread[i].Priority:=tpNormal;  //ïðèîðèòåò
    Thread[i].FreeOnTerminate:=True;
    Thread[i].Resume;
end;




end.
ВОТ ВТОРОЙ UNIT

Код:
unit Unit2; 

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  MyPotok = class(TThread)
  public
    a, b, n:integer;
    protected
    procedure Execute; override;
    procedure lfs;
  end;
  
implementation
  uses unit1;

procedure MyPotok.lfs;
begin

end;

procedure MyPotok.Execute;
var t1,t2,t:integer;
    Year,Month,Day,dn:Word;
begin
   t1:=Trunc(DateTimePicker1.В ЭТОМ МЕСТЕ Я НЕ МОГУ ПОСТАВИТЬ TIME , так как он не видит этот объект);
   t2:=Trunc(DateTimePicker2.В ЭТОМ МЕСТЕ Я НЕ МОГУ ПОСТАВИТЬ TIME , так как он не видит этот объект);
   For t:=t1 to t2 do
   begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
      If (dn=6) and (Day=13) then
      Listbox1.Items.Add(FormatDateTime('Äàòà: dd.mm.yyyy ddd',t));
   end;
end;
end.
ОШИБКА: unable to invoke code completion due to errors in source code delphi

Последний раз редактировалось Djavol; 01.02.2017 в 19:48.
Djavol вне форума Ответить с цитированием
Старый 01.02.2017, 19:34   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Выложи весь проект.
ura_111 вне форума Ответить с цитированием
Старый 01.02.2017, 19:35   #3
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Выложи весь проект.
Зачем?
Djavol вне форума Ответить с цитированием
Старый 01.02.2017, 19:36   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

То, что называется пощупать его в живую.
ura_111 вне форума Ответить с цитированием
Старый 01.02.2017, 19:36   #5
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
То, что называется пощупать его в живую.
А че так не скажешь?
Djavol вне форума Ответить с цитированием
Старый 01.02.2017, 21:43   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

http://www.programmersforum.ru/showp...01&postcount=4
пункт 3.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 01.02.2017, 22:11   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Во первых даже если unit2 и увидит ваши контролы c Unit1, а увидит он их так Form1.Listbox1.Items.Add(FormatDate Time('dd.mm.yyyy ddd',t)) и form1.DateTimePicker1, в потоке возможно будут ошибки с отображением данных т.к. нужна синхронность Synchronize.
Данные еще можно возвращать в обратном вызове из потока Unit2 в Unit1.
И в заключении, зачем вам массив потоков вам хватит Thread: MyPotok, он и так будет создаваться сколько угодно и по завершению сам уничтожиться.
По изучайте потоки, здесь информации много, вот к примеру. http://programmersforum.ru/showthrea...=301418&page=3

Вот кое что накидал из вашего кода правда тоже без Synchronize но ошибок пока нет.

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TMyPotok = class(TThread)
  private
  FT1: Integer;
  FT2: Integer;
  FResultList: TStrings;
  protected
  procedure Execute; override;
  destructor Destroy; override;
  public
  constructor Create(T1, T2: integer; ResultList: TStrings); virtual;
  end;

implementation

constructor TMyPotok.Create(T1, T2: integer; ResultList: TStrings);
begin
   inherited Create(true);
  FreeOnTerminate := True;
  FT1:= T1;
  FT2:= T2;
  FResultList:= ResultList;
  Resume;
end;

destructor TMyPotok.Destroy;
begin
inherited;
end;

procedure TMyPotok.Execute;
var t:integer;
    Year,Month,Day,dn:Word;
begin
    For t:=Ft1 to Ft2 do
    begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
     If (dn=6) and (Day=13) then
     FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
    end;
end;
end.
В Uses1
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
    t1, t2: integer;
  MyPotok: TMyPotok;
  begin
   t1:= Trunc(DateTimePicker1.Time);
   t2:= Trunc(DateTimePicker2.Time);
   MyPotok:= TMyPotok.Create(t1, t2, ListBox1.items);
end;

Последний раз редактировалось Aliens_wolfs; 02.02.2017 в 00:02.
Aliens_wolfs вне форума Ответить с цитированием
Старый 02.02.2017, 14:53   #8
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Во первых даже если unit2 и увидит ваши контролы c Unit1, а увидит он их так Form1.Listbox1.Items.Add(FormatDate Time('dd.mm.yyyy ddd',t)) и form1.DateTimePicker1, в потоке возможно будут ошибки с отображением данных т.к. нужна синхронность Synchronize.
Данные еще можно возвращать в обратном вызове из потока Unit2 в Unit1.
И в заключении, зачем вам массив потоков вам хватит Thread: MyPotok, он и так будет создаваться сколько угодно и по завершению сам уничтожиться.
По изучайте потоки, здесь информации много, вот к примеру. http://programmersforum.ru/showthrea...=301418&page=3

Вот кое что накидал из вашего кода правда тоже без Synchronize но ошибок пока нет.


Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TMyPotok = class(TThread)
  private
  FT1: Integer;
  FT2: Integer;
  FResultList: TStrings;
  protected
  procedure Execute; override;
  destructor Destroy; override;
  public
  constructor Create(T1, T2: integer; ResultList: TStrings); virtual;
  end;

implementation

constructor TMyPotok.Create(T1, T2: integer; ResultList: TStrings);
begin
   inherited Create(true);
  FreeOnTerminate := True;
  FT1:= T1;
  FT2:= T2;
  FResultList:= ResultList;
  Resume;
end;

destructor TMyPotok.Destroy;
begin
inherited;
end;

procedure TMyPotok.Execute;
var t:integer;
    Year,Month,Day,dn:Word;
begin
    For t:=Ft1 to Ft2 do
    begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
     If (dn=6) and (Day=13) then
     FResultList.Add(FormatDateTime('dd.mm.yyyy ddd',t));
    end;
end;
end.
В Uses1
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
    t1, t2: integer;
  MyPotok: TMyPotok;
  begin
   t1:= Trunc(DateTimePicker1.Time);
   t2:= Trunc(DateTimePicker2.Time);
   MyPotok:= TMyPotok.Create(t1, t2, ListBox1.items);
end;
СПАСИБО ОГРОМНОЕ! А можетенаписать как синхронайз оформить?
Код:
procedure MyClass.UpdateListBox;
var t:integer;
begin
    Form1.Listbox1.Items.add(FormatDateTime('Äàòà: dd.mm.yyyy ddd',t));
end;


procedure MyClass.Execute;
var
t:integer;
    Year,Month,Day,dn:Word;
begin
   form1.ListBox1.Clear;
   t1:=Trunc(form1.DateTimePicker1.Time);
   t2:=Trunc(form1.DateTimePicker2.time);
   for t:=t1 to t2 do
   begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
      If (dn=6) and (Day=13) then

     Form1.Listbox1.Items.add(FormatDateTime('Äàòà: dd.mm.yyyy ddd',t));
     synchronize(UpdateListBox);
end;
end;
end.
Правильно?
Djavol вне форума Ответить с цитированием
Старый 02.02.2017, 20:08   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Ну тогда вот так если такой путь избрали

Код:
type
MyClass= class(TThread)
FResultStr: string; объявите в классе потока
............................


procedure MyClass.UpdateListBox;
begin
 Form1.Listbox1.Items.add(FResultStr);
end;

procedure MyClass.Execute;
var t, t1, t2:integer;
    Year,Month,Day,dn:Word;
begin
   t1:=Trunc(form1.DateTimePicker1.Time);
   t2:=Trunc(form1.DateTimePicker2.time);
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.

Последний раз редактировалось Aliens_wolfs; 02.02.2017 в 20:31.
Aliens_wolfs вне форума Ответить с цитированием
Старый 02.02.2017, 20:55   #10
Djavol
Пользователь
 
Регистрация: 17.04.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Ну тогда вот так если такой путь избрали

Код:
type
MyClass= class(TThread)
FResultStr: string; объявите в классе потока
............................


procedure MyClass.UpdateListBox;
begin
 Form1.Listbox1.Items.add(FResultStr);
end;

procedure MyClass.Execute;
var t, t1, t2:integer;
    Year,Month,Day,dn:Word;
begin
   t1:=Trunc(form1.DateTimePicker1.Time);
   t2:=Trunc(form1.DateTimePicker2.time);
     For t:=Ft1 to Ft2 do
     begin
      DecodeDate(t,Year,Month,Day);
      dn:=DayOfWeek(t);
    If (dn=6) and (Day=13) then
    begin
     FResultStr:= FormatDateTime('dd.mm.yyyy ddd',t);
     synchronize(UpdateListBox);
    end;
    end;
end;

end.
Будь добр, если не трудно, посмотри пожалуйста проект. Все ли правильно я сделал, а то сам уже не понимаю!
Вложения
Тип файла: rar UT Friday13.rar (177.6 Кб, 9 просмотров)
Djavol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение двух форм VHomer Компоненты Delphi 4 27.08.2015 14:18
Объединение двух векторов в матрицу, состоящую из двух столбцов[matlab] fygas1991 Помощь студентам 0 22.01.2015 00:09
Объединение двух запросов Xakand_2009 БД в Delphi 4 10.07.2012 15:05
Объединение двух Tchart в один (Delphi) Николай ПН Помощь студентам 5 18.03.2010 22:57
Объединение двух таблиц jekis2506 Microsoft Office Excel 5 15.04.2009 08:34