📄 ucomposesms.pas
字号:
var
smsRef: String;
it,sl: TTntStringList;
k, i, j, m, startpos, stoppos: Integer;
group,complex: Boolean;
str, grp, smsText, smsTemp: WideString;
smstot,udhi:string;
packetL: Integer;
procedure CheckValidNumber(number: string);
var
j: Integer;
begin
for j := 1 to length(number) do
if not isDelimiter('+0123456789pt,', number, j) then begin // do not localize
MessageBeep(MB_ICONEXCLAMATION);
MessageDlgW(WideFormat(_('Invalid number specified for %s.'),[number]),
mtError, MB_OK);
Abort;
end;
end;
begin
sl := TTntStringList.Create;
try
str := '';
// TODO: Use GetFirstToken(Edit1.Text,';') to separate recipients here....
for i := 1 to length(Edit1.Text) do begin
if not IsDelimiter(';', Edit1.Text, i) then str := str + Edit1.Text[i]
else begin
if trim(str) <> '' then sl.Add(trim(str));
str := '';
end;
if i = length(Edit1.Text) then
if trim(str) <> '' then sl.Add(trim(str));
end;
if sl.Count = 0 then begin
MessageBeep(MB_ICONEXCLAMATION);
MessageDlgW(_('You have to select at least one recepient.'),mtError, MB_OK);
Abort;
end;
{ TODO: sanity check all sl.items into separated loop after this one,
i.e. move CheckValidNumber there. }
for i := 0 to sl.Count-1 do begin
group := False;
complex := False;
for j := 1 to length(sl.Strings[i]) do begin
if IsDelimiter('[]', sl.Strings[i], j) then complex := True;
if IsDelimiter('{}', sl.Strings[i], j) then group := True;
end;
if group then begin
startpos := pos('{', sl.Strings[i]);
stoppos := pos('}', sl.Strings[i]);
{ make sure it will have at least one element }
if (startpos = 0) or (stoppos < (startpos+2)) then begin
MessageBeep(MB_ICONEXCLAMATION);
MessageDlgW(_('Invalid group address.'),mtError, MB_OK);
Abort;
end;
sl.Strings[i] := copy(sl.Strings[i], startpos + 1, stoppos - startpos - 1);
it := TTntStringList.Create;
try
grp := sl.Strings[i];
while grp <> '' do it.Add(GetFirstToken(grp));
{ convert all from names to numbers }
for k := 0 to it.Count-1 do begin
str := Form1.LookupNumber(it[k]);
if str <> '' then it[k] := str;
end;
{ sanity check }
for k := 0 to it.Count-1 do
CheckValidNumber(it[k]);
{ replace group with first memeber }
sl.Strings[i] := it[0];
{ then add others at the end of list. it's safe to do that
since these number don't have to be checked out. }
for k := 1 to it.Count-1 do
sl.Add(it[k]);
finally
it.free;
end;
end
else
if complex then begin
startpos := pos('[', sl.Strings[i]);
stoppos := pos(']', sl.Strings[i]);
{ make sure it will have at least one element }
if (startpos = 0) or (stoppos < (startpos+2)) then begin
MessageBeep(MB_ICONEXCLAMATION);
MessageDlgW(_('Invalid address specified.'),mtError, MB_OK);
Abort;
end;
{ sanity check }
sl.Strings[i] := copy(sl.Strings[i], startpos + 1, stoppos - startpos - 1);
CheckValidNumber(sl.Strings[i]);
end
else begin
{ Check if we have contact instead of number }
str := Form1.LookupNumber(sl.Strings[i]);
if str <> '' then sl.Strings[i] := str;
{ sanity check }
CheckValidNumber(sl.Strings[i]);
end;
end;
smsText := Memo.Text;
if btnLongSMS.Down and (Length(smsText) > FMaxLength) then begin
//sending Long SMS...
packetL := 0;
case FDCS of
gcsDefault7Bit:
packetL := (FMaxLength - 7); { 160 septets - UDH (6 octets+padding) }
gcs8BitOctets:
packetL := (FMaxLength - 6); { 140 octets - UDH (6 octets) }
gcs16bitUcs2:
packetL := (FMaxLength - 3); { 140 octets (70widechars) - UDH (6 octets) }
else Abort;
end;
smstot := IntToHex((Length(smsText) div packetL) + 1, 2);
//for all recepients...
for i := 0 to sl.Count - 1 do begin
StatusBar.Panels[2].Text := Format(_('Sending long message to %s...'), [sl.Strings[i]]);
//...create the sms ref...
smsRef := Form1.GetNextLongSMSRefference;
udhi := '050003' + smsRef + smsTot; // see docs for 050003 magic // do not localize
//...and send sms segments
for m := 1 to (length(smsText) div packetL) + 1 do begin
smsTemp := Copy(smsText, (m-1)*packetL + 1, packetL);
Form1.SendTextMessage(udhi + IntToHex(m,2), smsTemp, sl.Strings[i], btnRequestReply.Down, btnFlashSMS.Down,
btnStatusReport.Down, FDCS, AsDraft);
end;
end;
end
else begin
//normal SMS...
for i := 0 to sl.Count - 1 do begin
StatusBar.Panels[2].Text := Format(_('Sending message to %s...'), [sl.Strings[i]]);
Form1.SendTextMessage('', smsText, sl.Strings[i], btnRequestReply.Down, btnFlashSMS.Down, btnStatusReport.Down,
FDCS, AsDraft);
end;
end;
if AsDraft then
StatusBar.Panels[2].Text := Format(_('Total messages sent: %d'),[Form1.FSMSCounter]); // we're not sending actualy
if FChatMode then
StatusBar.Panels[2].Text := _('Sending message...'); // the recipient is well-known so dont show it
finally
sl.Free;
end;
{ Close window is sending as normal SMS }
if not AsDraft and not FChatMode then begin
btnSave.Enabled := False;
Close;
end;
end;
procedure TfrmMessageContact.SendClick(Sender: TObject);
begin
DoSend;
end;
procedure TfrmMessageContact.SaveClick(Sender: TObject);
begin
DoSend(True);
btnSave.Enabled := False;
end;
procedure TfrmMessageContact.Edit1Change(Sender: TObject);
begin
btnSave.Enabled := memo.Text <> '';
end;
procedure TfrmMessageContact.FormActivate(Sender: TObject);
begin
StatusBar.Panels[2].Text := Format(_('Total messages sent: %d'),[Form1.FSMSCounter]);
WarningPanel.Visible := Form1.FSMSDoWarning and (Form1.FSMSCounter >= Form1.FSMSWarning);
if WarningPanel.Visible then begin
if not FChatMode then
Memo.Top := WarningPanel.Top + WarningPanel.Height;
lbWarning.Caption := Format(_('Warning! You have reached your send limit of %d messages.'),[Form1.FSMSWarning]);
end;
ToolBar2Resize(nil);
end;
procedure TfrmMessageContact.PopupMenu1Click(Sender: TObject);
begin
AddRecipient((Sender as TTntMenuItem).Caption);
end;
procedure TfrmMessageContact.FavoritesPopupMenuPopup(Sender: TObject);
var
i: integer;
Item: TTntMenuItem;
begin
AddToFavorites1.Enabled := Edit1.Text <> '';
while FavoritesPopupMenu.Items.Count > 3 do
FavoritesPopupMenu.Items.Delete(3);
for i := 0 to Form1.FFavoriteRecipients.Count-1 do begin
Item := TTntMenuItem.Create(FavoritesPopupMenu);
Item.Caption := Form1.FFavoriteRecipients[i];
Item.AutoHotkeys := maManual;
Item.ImageIndex := 26;
Item.OnClick := PopupMenu1Click;
FavoritesPopupMenu.Items.Add(Item);
end;
end;
procedure TfrmMessageContact.btnRecentClick(Sender: TObject);
var
P: TPoint;
begin
//btnRecent.CheckMenuDropdown;
P := btnRecent.ClientToScreen(Point(0,btnRecent.Height));
btnRecent.DropdownMenu.Popup(P.X,P.Y);
end;
procedure TfrmMessageContact.ClearMessageCounter1Click(Sender: TObject);
begin
Form1.FSMSCounter := 0;
FormActivate(nil);
end;
procedure TfrmMessageContact.PopupMenu2Popup(Sender: TObject);
begin
ClearMessageCounter1.Enabled := Form1.FSMSCounter <> 0;
end;
procedure TfrmMessageContact.LongClick(Sender: TObject);
begin
if not btnLongSMS.Down and (length(Memo.Text) > FMaxLength) then begin
MessageBeep(MB_ICONQUESTION);
if MessageDlgW(_('This will crop some text from the end of the current message?'),
mtConfirmation, MB_OKCANCEL or MB_DEFBUTTON2) <> ID_OK then begin
btnLongSMS.Down := True;
exit;
end;
end;
if not btnLongSMS.Down then begin
Memo.Text := Copy(Memo.Text,1,FMaxLength);
Memo.SelStart := Length(Memo.Text);
end;
MemoChange(nil);
end;
procedure TfrmMessageContact.ToPopupMenuPopup(Sender: TObject);
begin
Delete1.Enabled := Edit1.SelText <> '';
AddToPhonebook1.Enabled := Delete1.Enabled and (Pos('{',Edit1.SelText) = 0) and
(Form1.LookupContact(Form1.ExtractNumber(Edit1.SelText)) = '');
end;
procedure TfrmMessageContact.Delete1Click(Sender: TObject);
begin
Edit1.SelText := '';
end;
procedure TfrmMessageContact.AddToPhonebook1Click(Sender: TObject);
begin
if Form1.frmSyncPhonebook.DoEdit(True,Form1.ExtractNumber(Edit1.SelText)) then
Edit1.SelText := Form1.ContactNumberByTel(Form1.ExtractNumber(Edit1.SelText));
end;
procedure TfrmMessageContact.AddToFavorites1Click(Sender: TObject);
begin
if Form1.FFavoriteRecipients.IndexOf(Edit1.Text) = -1 then begin
Form1.FFavoriteRecipients.Insert(0,Edit1.Text);
while Form1.FFavoriteRecipients.Count > MaxFavorites do
Form1.FFavoriteRecipients.Delete(MaxFavorites);
end;
end;
procedure TfrmMessageContact.Organize1Click(Sender: TObject);
begin
Form1.EditFavorites1.Click;
end;
procedure TfrmMessageContact.UCS2Click(Sender: TObject);
begin
with Sender as TTntMenuItem do Checked := not Checked;
Form1.FForceUCSusage := ForceUCS2Encoding1.Checked;
MemoChange(Memo);
end;
procedure TfrmMessageContact.EncodingPopupMenu1Popup(Sender: TObject);
begin
ForceUCS2Encoding1.Checked := Form1.FForceUCSusage;
end;
procedure TfrmMessageContact.FormCreate(Sender: TObject);
begin
gghTranslateComponent(self);
end;
procedure TfrmMessageContact.FormKeyPress(Sender: TObject;
var Key: Char);
begin
if Key = #27 then begin
Key := #0;
Close;
end;
end;
procedure TfrmMessageContact.TntFormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
try
Clear;
except
CanClose := False;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -