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

📄 main.pas

📁 ICQ客户端源代码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      if DBData.dwUIN = dwUIN then
      begin
        Position := FilePos(F)-1;
        Break;
      end;
    end;
    Result := Position;
  end;

begin
  FileName := ExtractFilePath(ParamStr(0)) + 'contacts.dat';
  try
    AssignFile(F, FileName);
    if FileExists(FileName) then
      Reset(F)
    else
      Rewrite(F);

    podm := ContactExists;

    if podm <> -1 then
    begin
      Seek(F, podm);         //Edit existing contact

      EmptyDBD.dwUIN := 0;
      EmptyDBD.dwStatus := S_OFFLINE;
      EmptyDBD.sInternalIP := '';
      EmptyDBD.sExternalIP := '';
      EmptyDBD.wPort := 0;
      EmptyDBD.byProtoVer := 0;
      EmptyDBD.byUserCaps := 0;
      EmptyDBD.dtOnlineTime := 0;
      EmptyDBD.dwClient := 0;
      EmptyDBD.dwMirandaVer := 0;
      EmptyDBD.sNick := '';

      Write(F, EmptyDBD);
    end;
  finally
    CloseFile(F);
  end;
end;

//Adding new user, UserInfo, Nick change
procedure TMainForm.WriteToDB(dwUIN: DWORD; DBD: _DBCONTACTSETTINGS);
var
  FileName: String;
  podm: Longint;

  function ContactExists: LongInt;
  var
    Position: Longint;
  begin
    Position := -1;
    while not EOF(F) do
    begin
      Read(F, DBData);
      if DBData.dwUIN = dwUIN then
      begin
        Position := FilePos(F)-1;
        Break;
      end;
    end;
    Result := Position;
  end;

begin
  FileName := ExtractFilePath(ParamStr(0)) + 'contacts.dat';
  try
    AssignFile(F, FileName);
    if FileExists(FileName) then
      Reset(F)
    else
      Rewrite(F);

    podm := ContactExists;

    if podm = -1 then
      Seek(F, FileSize(F))   //Add new contact
    else
      Seek(F, podm);         //Edit existing contact

    Write(F, DBD);
  finally
    CloseFile(F);
  end;
end;

procedure TMainForm.ReadFromDB(DBD: _DBCONTACTSETTINGS);
var
  FileName: String;
  ListItem: TListItem;
begin
  FileName := ExtractFilePath(ParamStr(0)) + 'contacts.dat';
  try
    AssignFile(F, FileName);
    if FileExists(FileName) then
      Reset(F)
    else
      Rewrite(F);

    while not EOF(F) do
    begin
      Read(F, DBD);

      if DBD.dwUIN <> 0 then
      begin

        ListItem := ListView1.Items.Add;

        ListItem.ImageIndex := ICON_OFFLINE;
        //UIN
        ListItem.Caption := IntToStr(DBD.dwUIN);
        ICQClient1.AddContact(DBD.dwUIN);
        //STATUS
        ListItem.SubItems.Add(IntToStr(DBD.dwStatus));
        //Internal IP
        ListItem.SubItems.Add(DBD.sInternalIP);
        //External IP
        ListItem.SubItems.Add(DBD.sExternalIP);
        //Port
        ListItem.SubItems.Add(IntToStr(DBD.wPort));
        //ProtoVer
        ListItem.SubItems.Add(IntToStr(DBD.byProtoVer));
        //UserCaps
        ListItem.SubItems.Add(IntToStr(DBD.byUserCaps));
        //Online since
        ListItem.SubItems.Add(FloatToStr(DBD.dtOnlineTime));
        //ICQ Client
        ListItem.SubItems.Add(IntToStr(DBD.dwClient));
        //Miranda version
        ListItem.SubItems.Add(IntToStr(DBD.dwMirandaVer));
        //Nick
        ListItem.SubItems.Add(DBD.sNick);
        //Idle
        ListItem.SubItems.Add('0');
      end;
    end;
  finally
    CloseFile(F);
  end;
end;

procedure TMainForm.RepaintOfflineCL;
var
  i: Integer;
begin
  if ListView1.Items.Count > 0 then
    for i := 0 to ListView1.Items.Count - 1 do
      ListView1.Items.Item[i].ImageIndex := ICON_OFFLINE;
  ListView1.Invalidate;
end;

procedure TMainForm.ReCreateContactList;
begin
  //ListView Filling
  ListView1.Items.Clear;
  ReadFromDB(DBData);
  ListView1.Invalidate;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  UserInfoReader := 0;

  bEditAble := False;

  FListViewWndProc := ListView1.WindowProc;
  ListView1.WindowProc := ListViewWndProc;

  //Load icons
  if not DoLoadIcons(ExtractFilePath(ParamStr(0)) + 'Icons/icons.dll') then
  begin
    MessageBox(Self.Handle,'Could not load icons! Application will be terminated.','Error',MB_OK);
    Application.Terminate;
  end;  

  GetWindowsVersion;


  if IsWinVer2000Plus then begin
    @MyGetLastInputInfo := GetProcAddress(GetModuleHandle('user32'), 'GetLastInputInfo');

    @MySetLayeredWindowAttributes := GetProcAddress(GetModuleHandle('user32.dll'), 'SetLayeredWindowAttributes');
  end;

  //Icons
  if IsWinVerXPPlus then  // IsWinVerXPPlus need 32-bit icons on XP for alpha channels
    hImlMenuIcons  := ImageList_Create(GetSystemMetrics(SM_CXSMICON),
      GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 or ILC_MASK, IconList.Count, 20)
  else
  //Win2k won't blend icons with imagelist_drawex when color-depth>16-bit.
  //Don't know about WinME, but it certainly doesn't support alpha channels
		hImlMenuIcons := ImageList_Create(GetSystemMetrics(SM_CXSMICON),
      GetSystemMetrics(SM_CYSMICON), ILC_COLOR16 or ILC_MASK, IconList.Count, 20);

  for i := 0 to IconList.Count - 1 do
  begin
    IconList.GetIcon(i, Icon);
    ImageList_AddIcon(hImlMenuIcons, Icon.Handle);
  end;

  //Icon
  IconList.GetIcon(ICON_OFFLINE, Icon);
  StatusBar1.Panels[0].Text := 'Offline';

  tnid.cbSize:= sizeof(tnid);
  tnid.Wnd:= Handle;
  tnid.uID:= Application.Icon.Handle;
  tnid.uFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;
  tnid.uCallbackMessage:= WM_NOTIFYICON;
  tnid.hIcon := Icon.Handle;
  StrPCopy(tnid.szTip, Format('ICQ - %s ', ['Offline']));
  Shell_NotifyIconA(NIM_ADD, @tnid);

  SetCriticalSettings(ReadSettings());
  SetSettings(ReadSettings());

  //List of avaible info query forms
  FInfoList := TList.Create;

  //Add users from contactlist to listview in offline mode
  ReCreateContactList;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if bHide then begin
    Action := caNone;
    Self.Hide;
  end
  else
    Application.Terminate;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
var
  DBSet: _DBSETTINGS;
begin
  TestHit := nil;

  DBSet := ReadSettings();
  DBSet.iHeight := Height;
  DBSet.iWidth := Width;
  WriteSettings(DBSet);

  DBSet := ReadSettings();
  DBSet.iLeft := Left;
  DBSet.iTop := Top;
  WriteSettings(DBSet);
  
  ListView1.WindowProc := FListViewWndProc;
  FListViewWndProc := nil;
  ImageList_Destroy(hImlMenuIcons);
  Shell_NotifyIconA(NIM_DELETE, @tnid);
  FInfoList.Free;
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  RefreshRowHeight;
  if dwLastStatus <> S_OFFLINE then DoStatusChange(dwLastStatus or fDCFlag);
end;

procedure TMainForm.DoStatusChange(NewStatus: LongWord);
var
  img: Byte;

  function SetAutoAwayMsg(AnyMsg: String): String;
  begin
    while Pos('%time%', AnyMsg) <> 0 do
    begin
      Insert(TimeToStr(Now), AnyMsg, Pos('%time%', AnyMsg));
      Delete(AnyMsg, Pos('%time%', AnyMsg), Length('%time%'));
    end;
    while Pos('%date%', AnyMsg) <> 0 do
    begin
      Insert(DateToStr(Now), AnyMsg, Pos('%date%', AnyMsg));
      Delete(AnyMsg, Pos('%date%', AnyMsg), Length('%date%'));
    end;
    Result := AnyMsg;
  end;

begin
  if not ICQClient1.LoggedIn then
  begin
    if (ICQClient1.Password = '') or (ICQClient1.UIN = 0) then
    begin
      MessageBox(MainForm.Handle, 'Please set UIN & Password in Options dialog!', 'Error!', MB_OK);
      options.Click;
      Exit;
    end;
    StatusBar1.Panels[0].Text := 'Connecting...';
    ICQClient1.Login(NewStatus);
  end else
  begin
    ICQClient1.Status := NewStatus;
    StatusBar1.Panels[0].Text := StatusToStr(ICQClient1.Status);
  end;

  case StatusToInt(NewStatus) of
    S_ONLINE : begin
                 img := ICON_ONLINE;
               end;
    S_AWAY   : begin
                 img := ICON_AWAY;
                 ICQClient1.AutoAwayMessage := SetAutoAwayMsg(MsgAway);
               end;
    S_DND    : begin
                 img := ICON_DND;
                 ICQClient1.AutoAwayMessage := SetAutoAwayMsg(MsgDND);
               end;
    S_NA     : begin
                 img := ICON_NA;
                 ICQClient1.AutoAwayMessage := SetAutoAwayMsg(MsgNA);
               end;
    S_INVISIBLE : begin
                    img := ICON_INVISIBLE;
                  end;
    S_OCCUPIED : begin
                   img := ICON_OCCUPIED;
                   ICQClient1.AutoAwayMessage := SetAutoAwayMsg(MsgOccupied);
               end;
    S_FFC     : begin
                 img := ICON_FFC;
                 ICQClient1.AutoAwayMessage := SetAutoAwayMsg(MsgFFC);
               end;
  else
    img := ICON_OFFLINE;
  end;
  
  IconList.GetIcon(img, Icon);
  StatusBar1.Invalidate;

  tnid.hIcon := Icon.Handle;
  StrPCopy(tnid.szTip, Format('ICQ - %s ', [StatusToStr(NewStatus)]));
  Shell_NotifyIconA(NIM_MODIFY, @tnid);
end;

procedure TMainForm.ICQClient1Login(Sender: TObject);
begin
  StatusBar1.Panels[0].Text := StatusToStr(ICQClient1.Status);
  ICQClient1.RequestOfflineMessages;
  AutoAwayTimer.Enabled := True;
end;

procedure TMainForm.ICQClient1ConnectionFailed(Sender: TObject);
begin
  IconList.GetIcon(ICON_OFFLINE, Icon);
  StatusBar1.Panels[0].Text := 'Connection failed';
  //ReCreateContactList;
  RepaintOfflineCL;

  if AutoAwayTimer.Enabled then AutoAwayTimer.Enabled := False;

  SetCriticalSettings(ReadSettings());
  AutoAwayTimer.Enabled := False;
  
  tnid.hIcon := Icon.Handle;
  StrPCopy(tnid.szTip, Format('ICQ - %s ', ['Connection failed']));
  Shell_NotifyIconA(NIM_MODIFY, @tnid);
end;

procedure TMainForm.ICQClient1StatusChange(Sender: TObject; UIN: String;
  Status: Cardinal);
var
  i, img: Integer;
begin
  if ListView1.Items.Count > 0 then
    for i := 0 to ListView1.Items.Count - 1 do
      if ListView1.Items.Item[i].Caption = UIN then
      begin
        case StatusToInt(Status) of
          S_ONLINE     : img := ICON_ONLINE;
          S_AWAY       : img := ICON_AWAY;
          S_DND        : img := ICON_DND;
          S_NA         : img := ICON_NA;
          S_INVISIBLE  : img := ICON_INVISIBLE;
          S_OCCUPIED   : img := ICON_OCCUPIED;
          S_FFC        : img := ICON_FFC;
        else
          img := ICON_OFFLINE;
        end;
        ListView1.Items.Item[i].ImageIndex := img;
        ListView1.Items.Item[i].SubItems[LV_INDEX_STATUS] := IntToStr(Status); //StatusToStr(Status);
        ListView1.Invalidate;
        Exit;
      end;
end;

procedure TMainForm.ICQClient1UserOffline(Sender: TObject; UIN: String);
var
  i: Integer;
  ListItem: TListItem;
begin
  //ListView Filling
  if ListView1.Items.Count > 0 then
    for i := 0 to ListView1.Items.Count - 1 do
      if ListView1.Items.Item[i].Caption = UIN then
      begin
        ListItem := ListView1.Items.Item[i];;
        ListItem.ImageIndex := ICON_OFFLINE;
        //STATUS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -