⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucomposesms.pas

📁 FMA is a free1 powerful phone editing tool allowing users to easily manage all of the personal data
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -