Inteligentny Dom, Inteligentny Budynek eHouse. Tworzenie formularza głównego (rozmieszczenie elementów na ekranie Tableta.
Na Formie głównej umieszczono 24 pola paneli typu tPanel dla wszystkich wyjść cyfrowych RM. Będą one stanowiły przyciski do włączania wyjść RoomManagera (czyli urządzeń elektrycznych). Dodatkowo ich kolor zależeć będzie od odczytanego stanu danego wyjścia. Z tego powodu nie zastosowaliśmy standardowych przycisków typu Tbutton lub podobnych, gdyż nie mają one możliwości zmiany koloru. Nazywamy je „outputX” gdzie X jest numerem wyjścia. Nie trzeba ich rozmieszczać, gdyż zrobi to automatycznie niniejsza aplikacja. Dla każdego przycisku wyjściowego należy przyporządkować to samo zdarzenie (onClick) – output1Click.
Na Formie głównej umieszczono 24 pola paneli typu tPanel dla wszystkich programów RM do uruchomienia. Będą one stanowiły przyciski do włączania programu bieżącego RoomManagera (czyli włączenia/ wyłączenia całej grupy urządzeń elektrycznych wraz ze zmianą progów pomiarowych wejść służących do regulacji np. temperatury). Nazywamy je „programX” gdzie X jest numerem programu. Analogicznie, nie trzeba ich rozmieszczać, gdyż zrobi to automatycznie niniejsza aplikacja. Dla każdego przycisku programu należy przyporządkować to samo zdarzenie (onClick) – program1Click.
Na formie głównej umieszczono 16 etykiet tekstowych typu Tlabel do wyświetlania wszystkich wyników pomiarów z RoomManagerów (o numeracji Label1 do Label16). Analogicznie jak w powyższych przypadkach nie trzeba ich rozmieszczać.
Widok formularza gotowego dla programu.
Inicjalizacja formularza w programie :
////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
var alignx,buttonindex,row,column,k,i:integer;
begin
getcomputername; //get the name of computer or panel – odczytuje nazwę
path:=getcurrentdir(); //local path get current application directory – odczytuje katalog w którym znajduje się program
path:=stringreplace(path,’\bin’,’\’,[rfignorecase] ); //get path of ehouse application
remotepath:=path; //the same path for remoteaccess for inicialization – na początku przyporządkowuje tą samą ścieżkę dla zdalnego dostępu
loadnames_rm; //load ehouse1 controller names
init_heat_temperature_names; //init heatmanager names
readethernetdevs; //load ethernet ehouse controllers names
i:=1;
while i<=paramcount do //perform command line argument – przetwarza linię komend
begin
if pos(’/x:’,lowercase(paramstr(i)))=1 then //panel width – szerokość panela
form1.Width:=chk_int(stringreplace(paramstr(i),’/x:’,”,[rfignorecase]));
if pos(’/y:’,lowercase(paramstr(i)))=1 then //panel height – wysokość panela
form1.height:=chk_int(stringreplace(paramstr(i),’/y:’,”,[rfignorecase]));
if pos(’/r:’,lowercase(paramstr(i)))=1 then //device name (RoomManager) – nazwa RoomMangera
deviceindex:=RMDeviceIndexByName((stringreplace(paramstr(i),’/r:’,”,[rfignorecase])));
if pos(’/a:’,lowercase(paramstr(i)))=1 then //device address (RoomManager) – adres roommanagera
deviceindex:=(get_index_rm(stringreplace(paramstr(i),’/a:’,”,[rfignorecase])));
if pos(’/p:’,lowercase(paramstr(i)))=1 then //remote access path – ścieżka zdalnego dostępu
remotepath:=((stringreplace(paramstr(i),’/p:’,”,[rfignorecase])));
inc(i);
end;
if form1.width<100 then form1.width:=800; //if wrong parameters for size sets default – wartości domyślne
if form1.height<100 then form1.height:=600;
devicestoupdatestatus:=inttostr(rm[deviceindex].adrh)+’-’+inttostr(rm[deviceindex].adrl);
//limit searching status for current roommanager /filter out other devices
//single device check for pannel for limitation utilisation
//sprawdza tylko status wybranego roommanagera wielokrotnie mniejsze obciążenie procesora i serwera eHouse
outputbuttonnames(deviceindex); //initialize buttons and labels names – inicjuje nazwy przycisków i etykiet tekstowych
form1.caption:=’eHouse Control Panel: '+rm[deviceindex].devname; //set caption of main form do RoomManager Name – pokazuje w nagłówku formularza nazwę roommanagera
timer1.interval:=3000; // set cyclic task interwal in miliseconds
timer1.Enabled:=true; //start automatic tasks (status update
k:=1;
buttonindex:=0; //current button (visible) index – numer bieżącego przycisku (widocznego)
row:=0; //current button in row – numer aktualnego przycisku w bieżącej linii
//column:=0;
alignx:=(form1.clientWidth-(rows)*(buttonwidth+xspace))div 2; //center buttons on panel – wycentrowanie bloków przycisków
for i:=0 to form1.ComponentCount-1 do //automatic Output button setup – automatyczne konfigurowanie przycisków Wyjść
begin //for each object on form1 – dla wszystkich elementów na Form1
if (form1.Components[i] is tpanel) then //if object is Tpanel (our button) – jeśli obiekt typu Tpanel (przycisk)
begin
if comparetext((form1.components[i] as tpanel).name,’output’+inttostr(k))=0 then //if name consist (output)
begin
row:=buttonindex mod (rows); //calculate rows and columns indexes – oblicza współrzędne kolumny i wiersza
column:=buttonindex div (rows);
if length(OutputNames[k-1])>0 then // Only shows ouput buttons with the name – tylko pokazuje przyciski z nazwą
begin
(form1.Components[i] as tpanel).left:=alignx+row*(buttonwidth+xspace); //calculate X axis possition – oblicza pozycję w osi X
(form1.Components[i] as tpanel).top:=yoffsetouts+column*(buttonheight+yspace); //calculate Y axis possition – oblicza pozycję w osi Y
(form1.Components[i] as tpanel).width:=buttonwidth; //Set Buttons Width – Szerokość przycisków
(form1.Components[i] as tpanel).height:=buttonheight; //Set Buttons Height – Wysokość przycisków
(form1.components[i] as tpanel).caption:=Outputnames[k-1]; //Set Button Caption – ustawia tekst przycisku
(form1.components[i] as tpanel).Bevelinner:=bvRaised;
(form1.components[i] as tpanel).BevelOuter:=bvRaised;
(form1.components[i] as tpanel).font.Size:=fontsize; //Set Button Font Size – ustawia rozmiar czcionki dla przycisku
inc(buttonindex); //next visible button – następny widoczny przycisk
end
else
begin
(form1.components[i] as tpanel).visible:=false; //no name = do not show button – usuwa przyciski bez nazw
end;
inc(k); // next button – następny przycisk
end;
end;
end;
//////////// The same for program buttons – Analogicznie dla przycisków do uruchamiania programów
buttonindex:=0;
k:=1;
for i:=0 to form1.ComponentCount-1 do
begin
if (form1.Components[i] is tpanel) then
begin
if comparetext((form1.components[i] as tpanel).name,’program’+inttostr(k))=0 then
begin
row:=buttonindex mod (rows);
column:=buttonindex div (rows);
if length(ProgramNames[k-1])>0 then
begin
(form1.Components[i] as tpanel).left:=alignx+row*(buttonwidth+xspace);
(form1.Components[i] as tpanel).top:=yoffsetprograms+column*(buttonheight+yspace);
(form1.Components[i] as tpanel).width:=buttonwidth;
(form1.Components[i] as tpanel).height:=buttonheight;
(form1.components[i] as tpanel).caption:=Programnames[k-1]; //set button caption for program buttons – ustawia nazwy przycisków programu
(form1.components[i] as tpanel).Bevelinner:=bvRaised;
(form1.components[i] as tpanel).BevelOuter:=bvRaised;
(form1.components[i] as tpanel).font.Size:=fontsize;
inc(buttonindex);
end
else
begin
(form1.components[i] as tpanel).visible:=false;
end;
inc(k);
end;
end;
end;
k:=1;
buttonindex:=0;
//alignx:=(form1.clientWidth-(labelrows*(labelwidth+xspace+labelresultsize)))div 2;
///////Analogicaly for Labels – Analogicznie dla etykiet
for i:=0 to form1.ComponentCount-1 do
begin
if (form1.Components[i] is tlabel) then
begin
if comparetext((form1.components[i] as tlabel).name,’label’+inttostr(k))=0 then
begin
row:=buttonindex mod (labelrows);
column:=buttonindex div (labelrows);
if length(LabelNames[k-1])>0 then //if length of label text > 0 – jesli opis istnieje
begin
(form1.Components[i] as tlabel).left:=alignx+row*(labelwidth+xspace+labelresultsize); //calculate X location
(form1.Components[i] as tlabel).top:=yoffsetlabel+column*(labelheight+yspace); //calculate Y location
(form1.Components[i] as tlabel).width:=labelwidth;
(form1.Components[i] as tlabel).height:=labelheight;
(form1.components[i] as tlabel).caption:=LabelNames[k-1]; ///assign label captions – nadaje naglówki etykietom
(form1.components[i] as tlabel).font.color:=clwhite; //set default color for label – ustawia domyslny kolor dla etykiety
if pos('[-%]’,LabelNames[k-1])>0 then (form1.components[i] as tlabel).font.color:=clyellow; //set color for light measurement – kolor dla pomiaru oswietlenia
if pos('[%]’,LabelNames[k-1])>0 then (form1.components[i] as tlabel).font.color:=claqua; //set color for percent measurement – kolor dla wartosci procentowej
if pos('[C]’,LabelNames[k-1])>0 then (form1.components[i] as tlabel).font.color:=clwhite; //set color for temperature management – kolor dla wartosci temperatury
(form1.components[i] as tlabel).font.Size:=labelfontsize; //set font size for label – ustawia rozmiar czcionki dla etykiety tekstowej
inc(buttonindex); //next visible label – następna widoczna etykieta
end
else
begin
(form1.components[i] as tlabel).visible:=false; //hide labels without text – ukrywa etykiety bez textu
end;
inc(k); //next label – następna etykieta
end;
end;
end;
update_status; //update panel status for current device from logs – uaktualnia status sterownika z plików logu z serwera eHouse
end;
Efekt końcowy po automatycznym skonfigurowaniu i rozmieszczeniu przycisków przez program i usunięciu nieopisanych elementów (jeśli nie chcemy ich mieć na panelu z powodu ograniczenia praw dostępu lub nie wykorzystania danego wyjścia).
Więcej:
sterowniki mikroprocesorowe eHouse
Automatyka Domu eHouse
Inteligentny Dom Producent
Jeden komentarz do “Tworzenie Oprogramowania dla Paneli sterujących pokojami dla Tabletów Windows – Formularz”
Możliwość komentowania została wyłączona.