Skip to content

Commit 7b4578f

Browse files
committed
Реализован раздельный вывод сообщений для различных бесед
1 parent 516d69f commit 7b4578f

File tree

8 files changed

+357
-294
lines changed

8 files changed

+357
-294
lines changed

gui/MessageWidget/MessageControl.pas

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface
1616
uses
1717
{$I tox-uses.inc}
1818
Classes, SysUtils, Controls, Graphics, StringUtils, MessageList,
19-
MessageDraw, Messages, ActiveRegion, MessageItem;
19+
MessageDraw, Messages, ActiveRegion, MessageItem, FriendItem;
2020

2121
type
2222
TMessagePosition = (mpBefore, mpAfter);
@@ -26,7 +26,7 @@ TMessageControl = class(TCustomControl)
2626
FIsDown: Boolean;
2727
FPosition: Integer;
2828
FActive: TActiveRegion;
29-
FFrienSelect: AnsiString;
29+
FFrienSelect: TFriendItem;
3030
FMessageList: TMessageList;
3131
FDraw: TMessageDraw;
3232
procedure MessageGet(Sender: TObject; const Index: Integer; out Exist: Boolean;
@@ -44,7 +44,7 @@ TMessageControl = class(TCustomControl)
4444
constructor Create(AOwner: TComponent; MessageList: TMessageList); reintroduce;
4545
destructor Destroy; override;
4646

47-
procedure SelectFriend(FriendId: AnsiString);
47+
procedure SelectFriend(Friend: TFriendItem);
4848
end;
4949

5050
implementation
@@ -96,14 +96,14 @@ procedure TMessageControl.ActiveOnMessage(Sender: TObject; RegionMessage: TRegio
9696
function TMessageControl.DoMouseWheelDown(Shift: TShiftState;
9797
MousePos: TPoint): Boolean;
9898
begin
99-
FDraw.ScrollDown(4);
99+
FDraw.ScrollDown(40);
100100
Result := True;
101101
end;
102102

103103
function TMessageControl.DoMouseWheelUp(Shift: TShiftState;
104104
MousePos: TPoint): Boolean;
105105
begin
106-
FDraw.ScrollUp(4);
106+
FDraw.ScrollUp(40);
107107
Result := True;
108108
end;
109109

@@ -119,7 +119,6 @@ procedure TMessageControl.CreateWnd;
119119
FDraw.Align := alClient;
120120
FDraw.Parent := Self;
121121
FDraw.OnGet := MessageGet;
122-
FDraw.Redraw(FMessageList.GetMessageCount(nil) - 1);
123122
FActive.Parent := Self;
124123
end;
125124

@@ -128,14 +127,21 @@ procedure TMessageControl.CreateWnd;
128127
procedure TMessageControl.MessageGet(Sender: TObject; const Index: Integer;
129128
out Exist: Boolean; out Mess: TMessageItem);
130129
begin
131-
// Exist := FMessageList.GetMessage(FFrienSelect, Index, Mess);
130+
if not Assigned(FFrienSelect) then
131+
Exist := False
132+
else
133+
Exist := FMessageList.GetMessage(FFrienSelect.ClientId, Index, Mess);
132134
end;
133135

134136
{ * Открытие диалога с новым пользователем
135137
* }
136-
procedure TMessageControl.SelectFriend(FriendId: AnsiString);
138+
procedure TMessageControl.SelectFriend(Friend: TFriendItem);
139+
var
140+
LastMessage: Integer;
137141
begin
138-
FFrienSelect := FriendId;
142+
LastMessage := FMessageList.GetMessageCount(Friend.ClientId) - 1;
143+
FFrienSelect := Friend;
144+
FDraw.Redraw(LastMessage);
139145
end;
140146

141147
procedure TMessageControl.WndProc(var Message: TMessage);

gui/MessageWidget/MessageDraw.pas

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ procedure TMessageDraw.Paint;
214214
end;
215215
PaintTime := Now - PaintTime;
216216

217-
Canvas.TextOut(0, 0, 'Message count: ' + IntToStr(Length(FDrawItems)));
217+
Canvas.TextOut(0, 0, 'Message draw count: ' + IntToStr(Length(FDrawItems)));
218218
Canvas.TextOut(0, 13, 'Calc time: ' + FormatDateTime('ss.zzz', FCalcTime));
219219
Canvas.TextOut(0, 26, 'Paint time: ' + FormatDateTime('ss.zzz', PaintTime));
220220
end;
@@ -564,7 +564,7 @@ procedure TMessageDraw.RecreateItems;
564564
end
565565
else
566566
begin
567-
ActiveItem := nil
567+
ActiveItem := nil;
568568
end;
569569
end;
570570

@@ -600,12 +600,20 @@ procedure TMessageDraw.CombineDrawInfoArrays(var ItemOld, ItemNew: TDrawItemList
600600
* указанного. Указанное сообщение будет в самом низу компонента.
601601
* }
602602
procedure TMessageDraw.Redraw(BottomMessageIndex: Integer);
603+
var
604+
Item: TMessageInfo;
603605
begin
606+
for Item in FDrawItems do
607+
Item.Free;
608+
609+
SetLength(FDrawItems, 0);
610+
604611
FIsCreateList := False;
605612
FBottomMessageIndex := BottomMessageIndex;
606-
FBottomMessagePosition := -20;
613+
FBottomMessagePosition := 0;
607614
//RecreateItems;
608615
Resize;
616+
Invalidate;
609617
end;
610618

611619
procedure TMessageDraw.Resize;
@@ -681,6 +689,7 @@ procedure TMessageDraw.ScrollPage(Value: Integer);
681689
end;
682690
end;
683691

692+
684693
procedure TMessageDraw.SetDrawFont;
685694
begin
686695
if not Assigned(Parent) then

gui/UserList.pas

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@ TUserList = class(TCustomControl)
3434
FScroll: TScrollBarNormal;
3535
FSortName: TSortName;
3636
FSortStatus: TSortStatus;
37+
FOnSelectItem: TProcSelectItem;
3738
procedure ScrollOnScroll(Sender: TObject);
38-
procedure ListOnChangeSize(Sender: TObject);
39+
procedure ListChangeSize(Sender: TObject);
3940
procedure FriendsUpdate(Sender: TObject; Index: Integer);
4041
procedure LoadAllUsers;
4142
procedure FriendsNewItem(Sender: TObject);
4243
procedure SortList(UseBeginUpdate: Boolean);
4344
function StatusCmp(Status1, Status2: TToxUserStatus): SmallInt;
45+
procedure ListSelectItem(Sender: TObject; Item: TFriendItem);
4446
protected
4547
procedure CreateWnd; override;
4648
function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint)
@@ -54,6 +56,9 @@ TUserList = class(TCustomControl)
5456
reintroduce;
5557

5658
property Scroll: TScrollBarNormal read FScroll;
59+
60+
property OnSelectItem: TProcSelectItem read FOnSelectItem
61+
write FOnSelectItem;
5762
end;
5863

5964
implementation
@@ -89,7 +94,8 @@ procedure TUserList.CreateWnd;
8994
FList := TUserListDraw.Create(Self);
9095
FList.Align := alClient;
9196
FList.Parent := Self;
92-
FList.OnChangeSize := ListOnChangeSize;
97+
FList.OnChangeSize := ListChangeSize;
98+
FList.OnSelectItem := ListSelectItem;
9399

94100
FFriends.OnUpdateItem := FriendsUpdate;
95101
FFriends.OnNewItem := FriendsNewItem;
@@ -114,9 +120,11 @@ procedure TUserList.FriendsUpdate(Sender: TObject; Index: Integer);
114120
SortList(True);
115121
end;
116122

123+
{ * Перезагружает пользователей в список друзей в соответствии с выбранными
124+
* параметрами отображения списка и выбранной сортировкой.
125+
* }
117126
procedure TUserList.LoadAllUsers;
118127
var
119-
i: Integer;
120128
Item: TFriendItem;
121129
PItem: Pointer;
122130
begin
@@ -278,12 +286,18 @@ procedure TUserList.WndProc(var Message: TMessage);
278286
end;
279287
end;
280288

281-
procedure TUserList.ListOnChangeSize(Sender: TObject);
289+
procedure TUserList.ListChangeSize(Sender: TObject);
282290
begin
283291
FScroll.ListSize := FList.Size;
284292
FScroll.PageSize := FList.ClientHeight;
285293
end;
286294

295+
procedure TUserList.ListSelectItem(Sender: TObject; Item: TFriendItem);
296+
begin
297+
if Assigned(FOnSelectItem) then
298+
FOnSelectItem(Self, Item);
299+
end;
300+
287301
procedure TUserList.ScrollOnScroll(Sender: TObject);
288302
begin
289303
FList.Position := FScroll.Position;

gui/UserListDraw.pas

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ TUser = record
3030
end;
3131
TUsers = array of PUser;
3232

33+
TProcSelectItem = procedure(Sender: TObject; Item: TFriendItem) of object;
34+
3335
TUserListDraw = class(TGraphicControl)
3436
private
3537
FActiveRegion: TActiveRegion;
@@ -43,8 +45,9 @@ TUserListDraw = class(TGraphicControl)
4345
FSize: Integer;
4446
FStopUpdate: Boolean;
4547
FOnChangeSize: TNotifyEvent;
46-
FOnSelectItem: TNotifyEvent;
48+
4749
FSelectedItem: Integer;
50+
FOnSelectItem: TProcSelectItem;
4851
procedure SetPosition(const Value: Integer);
4952
procedure DrawItem(Y: Integer; UserName, StatusText: DataString;
5053
Status: TToxUserStatus; IsNewMessage: Boolean; UserIcon: TUserIcon;
@@ -85,7 +88,7 @@ TUserListDraw = class(TGraphicControl)
8588
property Size: Integer read FSize;
8689

8790
property OnChangeSize: TNotifyEvent read FOnChangeSize write FOnChangeSize;
88-
property OnSelectItem: TNotifyEvent read FOnSelectItem write FOnSelectItem;
91+
property OnSelectItem: TProcSelectItem read FOnSelectItem write FOnSelectItem;
8992
end;
9093

9194
implementation
@@ -263,6 +266,8 @@ procedure TUserListDraw.SetActiveItem(x, y: Integer; const IsRepaint: Boolean);
263266
end;
264267
end;
265268

269+
{ * Выделение элемента, расположенного в указанных координатах x и y.
270+
* }
266271
procedure TUserListDraw.SetSelectItem(x, y: Integer);
267272
var
268273
Item: Integer;
@@ -275,8 +280,9 @@ procedure TUserListDraw.SetSelectItem(x, y: Integer);
275280
FItems[Item].State := dsDown;
276281

277282
FSelectedItem := Item;
283+
278284
if Assigned(FOnSelectItem) then
279-
FOnSelectItem(Self);
285+
FOnSelectItem(Self, FItems[Item].Item);
280286

281287
Invalidate;
282288
end;

sqlite/SQLiteTable3.pas

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,18 @@ constructor TSQLiteTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring);
960960
Create(DB, SQL, []);
961961
end;
962962

963+
function IsIntegerColumn(ColumnName: PAnsiChar): Boolean;
964+
begin
965+
Result := (ColumnName = 'INTEGER') or (ColumnName = 'BOOLEAN') or
966+
(ColumnName = 'BOOL')
967+
end;
968+
969+
function IsNumericColumn(ColumnName: PAnsiChar): Boolean;
970+
begin
971+
Result := (ColumnName = 'NUMERIC') or (ColumnName = 'FLOAT') or
972+
(ColumnName = 'DOUBLE') or (ColumnName = 'REAL');
973+
end;
974+
963975
constructor TSQLiteTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring;
964976
const Bindings: array of const);
965977
var
@@ -1013,15 +1025,14 @@ constructor TSQLiteTable.Create(DB: TSQLiteDatabase; const SQL: Ansistring;
10131025
new(thisColType);
10141026
DeclaredColType := Sqlite3_ColumnDeclType(Stmt, I);
10151027
if DeclaredColType = nil then
1028+
begin
10161029
thisColType^ := Sqlite3_ColumnType(Stmt, I)
10171030
// use the actual column type instead
10181031
// seems to be needed for last_insert_rowid
1019-
else if (DeclaredColType = 'INTEGER') or
1020-
(DeclaredColType = 'BOOLEAN') then
1032+
end
1033+
else if IsIntegerColumn(DeclaredColType) then
10211034
thisColType^ := dtInt
1022-
else if (DeclaredColType = 'NUMERIC') or
1023-
(DeclaredColType = 'FLOAT') or (DeclaredColType = 'DOUBLE') or
1024-
(DeclaredColType = 'REAL') then
1035+
else if IsNumericColumn(DeclaredColType) then
10251036
thisColType^ := dtNumeric
10261037
else if DeclaredColType = 'BLOB' then
10271038
thisColType^ := dtBlob

0 commit comments

Comments
 (0)