- Ayağımı kırdım raporluyum, evde oturuyorum.

- Geçtiğimiz bir kaç gün önce aklıma geldi de kolları sıvadım. DelphiTurkiye Forum için bir Parse işlemlerini içeren bir HelperClass hazırladım.
- Hem windows hem de android uyumludur. Kaynak kodları aşağıdadır. Bu mesaj ekindeki halini indirin ki forum resimleri de oradadır.
- Forum resimlerini içeren resource da aynı klasördedir.
- Bu sınıf yardımı ile oluşturduğum örnek Android projeyi de bu linkten indirebilirsiniz.
Kod: Tümünü seç
{***************************************************************************}
{ }
{ DelphiTürkiye Forum Helper Class }
{ }
{ Copyright (C) 2015 Muharrem ARMAN }
{ muharrem.arman@trt.net.tr }
{ }
{***************************************************************************}
{ }
{ Delphi Türkiye - Forum RSS desteği bulunmamaktadır. }
{ RSS benzeri hızlı veri almak konusunda Indy bileşeni ile desteklenmiş }
{ bir yapıdan faydalanarak bu Class oluşturulmuştur. }
{ }
{ Üzerinde değişiklik yapmak serbesttir ancak lütfen bu etiket bloğu }
{ içine yaptığınız değişikliği ve künyenizi yazmayı ihmal etmeyiniz. }
{ }
{***************************************************************************}
{ Değişikliği Yapan, Yapılan Ekleme/Değişiklik bilgisi : }
{ }
{ }
{ }
{***************************************************************************}
unit DelphiTurkiyeHelper;
interface
Uses
{$IF defined(MSWINDOWS)}
Windows, Forms, Graphics, Controls, GifImg, Dialogs, IdAntiFreeze, ShellApi,
{$ELSEIF defined(ANDROID)}
FMX.Forms, System.IOUtils, FMX.Graphics, FMX.Types, FMX.Objects,
System.Types, System.UITypes, IdAntiFreezeBase,
Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText,
{$ENDIF}
IdHttp, IdUri, SysUtils, Classes;
Type
{$IF defined(ANDROID)}
TIdAntiFreeze = class(TIdAntiFreezeBase)
public
procedure Process; override;
end;
{$ENDIF}
tDelphiTurkiyeHelper = Class(TObject)
Const
RootUrl = 'http://www.delphiturkiye.com/forum/';
LoginUrl = RootUrl + 'ucp.php?mode=login';
LogoutUrl = RootUrl + 'ucp.php?mode=logout';
MainUrl = RootUrl + 'index.php';
ForumImageSet : Array[0..52] of String = (
'forum_link' // 00
,'forum_read' // 01
,'forum_read_locked' // 02
,'forum_read_subforum' // 03
,'forum_unread' // 04
,'forum_unread_locked' // 05
,'forum_unread_subforum' // 06
,'topic_moved' // 07
,'topic_read' // 08
,'topic_read_mine' // 09
,'topic_read_hot' // 10
,'topic_read_hot_mine' // 11
,'topic_read_locked' // 12
,'topic_read_locked_mine' // 13
,'topic_unread' // 14
,'topic_unread_mine' // 15
,'topic_unread_hot' // 16
,'topic_unread_hot_mine' // 17
,'topic_unread_locked' // 18
,'topic_unread_locked_mine' // 19
,'sticky_read' // 20
,'sticky_read_mine' // 21
,'sticky_read_locked' // 22
,'sticky_read_locked_mine' // 23
,'sticky_unread' // 24
,'sticky_unread_mine' // 25
,'sticky_unread_locked' // 26
,'sticky_unread_locked_mine' // 27
,'announce_read' // 28
,'announce_read_mine' // 29
,'announce_read_locked' // 30
,'announce_read_locked_mine' // 31
,'announce_unread' // 32
,'announce_unread_mine' // 33
,'announce_unread_locked' // 34
,'announce_unread_locked_mine' // 35
,'global_read' // 36
,'global_read_mine' // 37
,'global_read_locked' // 38
,'global_read_locked_mine' // 39
,'global_unread' // 40
,'global_unread_mine' // 41
,'global_unread_locked' // 42
,'global_unread_locked_mine' // 43
,'pm_read' // 44
,'pm_unread' // 45
,'icon_post_target' // 46
,'icon_post_target_unread' // 47
,'icon_topic_attach' // 48
,'icon_topic_latest' // 49
,'icon_topic_newest' // 50
,'icon_topic_reported' // 51
,'icon_topic_unapproved' // 52
);
Type
pForumTopicTitles = ^tForumTopicTitles;
tForumTopicTitles = Record
StateImg, // 00
StateTitle, // 01
CevapSay, // 02
GoruntuSay, // 03
Baslik, // 04
BaslikUrl, // 05
AcilisTar, // 06
Yazar, // 07
YazarUrl, // 08
SonMesajTar, // 09
SonMesajUrl, // 10
SonUser, // 11
SonUserUrl // 12
: String;
end;
Type
pForumTopicPost = ^tForumTopicPost;
tForumTopicPost = Record
StateImg, // 00
StateTitle, // 01
User, // 02
Baslik, // 03
BaslikUrl, // 04
BaslikTar, // 05
UserState, // 06
UserRank, // 07
UserRegTar, // 08
UserMesCount, // 09
UserFrom, // 10
Mesaj, // 11
MesajTemiz // 12
: String;
end;
private
FIdHttp : TIdHttp;
FIdAntiFreeze : TIdAntiFreeze;
FSidStr : String;
FLogOutSid : String;
FboolLogin : Boolean;
FStyleStr : String;
FstrGelen : String;
FsonUrl : String;
FstrStyles : String;
FstrUserName : String;
FstrAvatarUrl : String;
FAvatarBitmap : TBitmap;
FStyleIdx : Integer; // SubSilver style olayını force edicez.. İki farklı tasarımdan kurtuluyoruz...
procedure TextKaydet( strIcerik, strPrefix, strKonum: String );
function VeriOku( Var strIcerik: String; strAra, strSon: String; boolKaynakTemizle:Boolean ): String;
function TaglariTemizle( strIcerik: String ): String;
function StylesList : String;
procedure DetayVeAvatarOku;
Public
constructor Create;
destructor Destroy; Override;
function Login( strLogin, strPass: String ): Boolean;
function LogOut: Boolean;
procedure OnlineUsers(ForumId:Integer; Liste:TStrings);
procedure ForumNotifications(Liste:TStrings);
function ForumTopicTitles(ForumId:Integer; Liste:TStrings; iSayfaAdedi: Integer ): String;
function ForumTopicPosts( strTopicUrl: String; Liste:TStrings; boolTumSayfalar : Boolean): String;
function GetHTML( strUrl: String ): String;
function IsLogged : Boolean;
function LastContent : String;
function Styles: String;
function IdxFromImageSet( strImageSet:String ): Integer;
procedure SmallImageRefresh;
procedure Avatar( Bitmap: TBitmap );
function ActiveUserName: String;
procedure BrowserIleAc( strUrl: String );
{$IF defined(MSWINDOWS)}
procedure DummyImageTazele( strRCFolderPath, strRCFileName, strImageFolderName : String);
{$ENDIF}
Var
ForumImages : Array of TBitmap;
End;
implementation
{$IF defined(ANDROID)}
{ TIdAntiFreeze }
procedure TIdAntiFreeze.Process;
begin
Application.ProcessMessages;
end;
{$ENDIF}
{ tDelphiTurkiyeHelper }
{$R 'DelphiTurkiyeHelper.res'} // Forum resimleri bu RES dosyasındadır...
constructor tDelphiTurkiyeHelper.Create;
Var
List: TStringList;
begin
FIdHttp := TIdHttp.Create();
FIdHttp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)';
FIdHttp.HandleRedirects := True;
FIdAntiFreeze := TIdAntiFreeze.Create(FIdHttp);;
FstrStyles := StylesList();
List := TStringList.Create;
List.Text := FstrStyles;
FStyleIdx := 1 + List.IndexOf('subsilver2'); // 1 based...
List.Free;
SmallImageRefresh(); // Resimleri Peşinen Yükledik...
end;
destructor tDelphiTurkiyeHelper.Destroy;
Var
i : Integer;
begin
FIdAntiFreeze.Free;
If FIdHttp.Connected then
begin
FIdHttp.Disconnect(false);
FIdHttp.IOHandler.InputBuffer.Clear();
FIdHttp.IOHandler.Close;
end;
FIdHttp.Free;
FIdHttp := Nil;
if (High(ForumImages)- Low(ForumImages)+1) > 0 then
begin
for i := Low(ForumImageSet) to High(ForumImageSet)
do ForumImages[i].Free;
end;
FAvatarBitmap.Free;
end;
function tDelphiTurkiyeHelper.GetHTML(strUrl: String): String;
Var
strGelen : String;
begin
strGelen := FIdHttp.Get( strUrl );
Result := strGelen;
end;
function tDelphiTurkiyeHelper.Login(strLogin, strPass: String): Boolean;
Var
strGelen, strAra: String;
PostParam : TStringList;
begin
// Önce get ile konumlanıyoruz ve sid alıyoruz...
strGelen := FIdHttp.Get( LoginUrl + '&style=' + SysUtils.IntToStr( FStyleIdx ) );
FSidStr := VeriOku( strGelen, 'index.php?sid=', '"', False );
FStyleStr := VeriOku( strGelen, './styles/', '/', False );
// Sonra post ile login bilgilerini yolluyoruz.
PostParam := TStringList.Create;
PostParam.Add('username=' + strLogin);
PostParam.Add('password=' + strPass );
PostParam.Add('redirect=' + LoginUrl + '&style=' + IntToStr( FStyleIdx ) );
PostParam.Add('sid=' + FSidStr);
PostParam.Add('redirect=index.php');
PostParam.Add('login=Giriş' );
Try
strGelen := FIdHttp.Post( LoginUrl, PostParam );
Finally
PostParam.Free;
End;
FboolLogin := Pos('ucp.php?mode=logout', strGelen) >= 0;
FStrGelen := strGelen;
FsonUrl := LoginUrl + '&style=' + IntToStr( FStyleIdx );
strAra := 'ucp.php?mode=logout';
system.Delete(strGelen, 1, Pos( strAra, strGelen )-1 );
FLogOutSid := VeriOku( strGelen, 'sid=', '"', False );
Result := FBoolLogin;
DetayVeAvatarOku();
end;
function tDelphiTurkiyeHelper.LogOut: Boolean;
Const
LogOutHata = 'oturumunuz ile uyumlu istek yok';
Var
strGelen : String;
begin
Result := True;
if NOT FboolLogin then Exit;
strGelen := FIdHttp.Get( LogoutUrl + '&sid=' + FLogOutSid );
FStrGelen := strGelen;
FsonUrl := LogoutUrl + '&sid=' + FLogOutSid;
FBoolLogin := Pos( LogOutHata, strGelen) > 0;
if NOT FboolLogin then begin
FSidStr := '';
FLogOutSid := '';
end;
Result := FBoolLogin;
end;
Procedure tDelphiTurkiyeHelper.OnlineUsers(ForumId:Integer; Liste:TStrings);
Var
strGelen, strAra, strOffset, strUserId, strUser : String;
begin
if NOT FboolLogin then Exit;
Liste.Clear;
case ForumId of
0 : FsonUrl := MainUrl + '?style=' + IntToStr( FStyleIdx );
end;
strGelen := FIdHttp.Get( FsonUrl );
FStrGelen := strGelen;
strAra := '>Kimler çevrimiçi<';
system.Delete( strGelen, 1, Pos(strAra, strGelen) + Length(strAra)-1 );
// --- Style Paketine Özel Offset --- //
if FStyleStr = 'subsilver2'
then strOffset := 'Yetkiler :'
else begin
Liste.Text := 'Forum style paketi "'+ FStyleStr+'" parse edilemedi...';
Exit;
end;
// ---------------------------------- //
strGelen := Copy(strGelen, 1, Pos(strOffset, strGelen)-1);
strAra := 'mode=viewprofile&u=';
while Pos(strAra, strGelen) > 0 do begin
strUserId := VeriOku( strGelen, strAra, '"', False );
System.Delete( strGelen, 1, Pos( strAra, strGelen ) + Length( strAra )-1 );
strUser := VeriOku( strGelen, '>', '<', False );
Liste.Add( Format('%s|%s|', [ strUserId, strUser ]) );
end;
end;
procedure tDelphiTurkiyeHelper.ForumNotifications(Liste: TStrings);
Var
strGelen, strAra, strUrl, strOffset, strTitle, strUser : String;
begin
if NOT FboolLogin then Exit;
Liste.Clear;
strGelen := FIdHttp.Get( MainUrl + '?style=' + IntToStr( FStyleIdx ) );
FSonUrl := MainUrl+'?style=' + IntToStr( FStyleIdx );
FStrGelen := strGelen;
strAra := 'Bildirimler';
system.Delete( strGelen, 1, Pos(strAra, strGelen) + Length(strAra)-1 );
strGelen := Copy(strGelen, 1, Pos('Tümünü Gör', strGelen)-1);
// --- Style Paketine Özel Offset --- //
if FStyleStr = 'subsilver2'
then strOffset := '"notification_title"'
else begin
Liste.Text := 'Forum style paketi "'+ FStyleStr+'" parse edilemedi...';
Exit;
end;
// ---------------------------------- //
strAra := 'href="./';
while Pos(strOffset, strGelen) > 0 do begin
strAra := strOffset;
System.Delete( strGelen, 1, Pos( strAra, strGelen ) + Length( strAra )-1 );
strAra := './';
strUrl := RootUrl + VeriOku( strGelen, strAra, '"', False);
strAra := 'username';
System.Delete( strGelen, 1, Pos( strAra, strGelen ) + Length( strAra )-1 );
strUser := VeriOku( strGelen, '>', '<', False);
strAra := '<strong';
System.Delete( strGelen, 1, Pos( strAra, strGelen ) + Length( strAra )-1 );
strTitle := VeriOku( strGelen, '>', '<', False);
strTitle := strTitle + '|' + VeriOku( strGelen, '"notification-reference">', '<', False);
if Pos('mark_notification', strUrl) > 0
then Liste.Add( Format('%s|(*)%s|%s', [ strUser, strTitle, strUrl ]) )
else Liste.Add( Format('%s|%s|%s', [ strUser, strTitle, strUrl ]) );
end;
end;
function tDelphiTurkiyeHelper.ForumTopicTitles(ForumId:Integer; Liste:TStrings; iSayfaAdedi: Integer ): String;
Var
strKatAra,
strKatBlokSonu,
strTitAra,
strThread,
strGelen, strBlok, strAra,
strKatUrl, strKategori,
strUrl, strTitle, strStateImg, strStateTitle : String;
Bilgi : pForumTopicTitles;
boolSonraki : Boolean;
begin
Result := ''; //sonraki sayfa...
if NOT FboolLogin then Exit;
// --- Style Paketine Özel Offset --- //
if FStyleStr = 'subsilver2' then begin
strKatAra := '<td class="cat" colspan="2">';
strKatBlokSonu := '<td class="cat" colspan="2">';
strTitAra := '<a class="forumlink"';
strThread := '<a title="Gönderilme zamanı';
end
else begin
Liste.Text := 'Forum style paketi "'+ FStyleStr+'" parse edilemedi...';
Exit;
end;
// ---------------------------------- //
Liste.Clear;
if ForumId = 0
then FSonUrl := MainUrl + '?style=' + IntToStr( FStyleIdx )
else FSonUrl := Format('%sviewforum.php?f=%d&style=%d', [RootUrl, ForumId, FStyleIdx] );
if ForumId = 0 then
begin
strGelen := FIdHttp.Get( FSonUrl );
FStrGelen := strGelen;
while Pos(strKatAra, strGelen) > 0 do
begin // strKategori
strAra := strKatAra;
system.Delete( strGelen, 1, Pos(strAra, strGelen) + Length(strAra)-1 );
strKatUrl := RootUrl + VeriOku( strGelen, './', '"', True);
strKategori := VeriOku( strGelen, '>', '<', True);
strBlok := Copy( strGelen, 1, Pos( strKatBlokSonu, strGelen )-1);
while Pos(strTitAra, strBlok) > 0 do begin
strAra := strTitAra;
system.Delete( strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
strUrl := RootUrl + VeriOku( strBlok, './', '"', True);
strTitle := VeriOku( strBlok, '>', '<', True);
strStateImg := VeriOku( strGelen, '<span class="imageset', '"', True );
strStateTitle := VeriOku( strGelen, 'title="', '"', True );
VeriOku( strGelen, '', '<tr>', True);
if Pos('viewforum.php', strKatUrl) > 0 then
Liste.Add( Format('%s|%s|%s|%s|%s', [ strStateImg, strStateTitle, strKategori, strTitle, strUrl ]) );
end;
end // While Kategory...
end
else
begin
boolSonraki := True;
while boolSonraki do
begin
Dec(iSayfaAdedi);
if iSayfaAdedi = 0 then boolSonraki := False;
FStrGelen := FIdHttp.Get( FSonUrl );
strGelen := FstrGelen; // Tazeleyelim...
strAra := '>Duyurular<';
VeriOku( strGelen, '>Duyurular', '<', True); // Buraya kadar törpüle...
strGelen := VeriOku( strGelen, '', '</table>', False);
while Pos('<tr>', strGelen) > 0 do
begin // strThread
New(Bilgi);
strAra := '<tr>';
system.Delete( strGelen, 1, Pos(strAra, strGelen) + Length(strAra)-1 );
Bilgi.StateImg := VeriOku( strGelen, 'class="imageset ', '"', True );
Bilgi.StateTitle := VeriOku( strGelen, 'title="', '"', True );
Bilgi.AcilisTar := VeriOku( strGelen, '<a title="Gönderilme zamanı:', '"', True );
Bilgi.BaslikUrl := RootUrl + VeriOku( strGelen, './', '"', True);
Bilgi.Baslik := VeriOku( strGelen, '"topictitle">', '<', True);
Bilgi.YazarUrl := RootUrl + 'memberlist.php' + VeriOku( strGelen, 'memberlist.php', '"', True);
VeriOku( strGelen, 'class="username', '>', True );
Bilgi.Yazar := VeriOku( strGelen, '', '<', True);
Bilgi.CevapSay := VeriOku( strGelen, '"topicdetails">', '<', True);
Bilgi.GoruntuSay := VeriOku( strGelen, '"topicdetails">', '<', True);
VeriOku( strGelen, '"topicdetails"', '"', True);
Bilgi.SonMesajTar := VeriOku( strGelen, '">', '<', True);
Bilgi.SonUserUrl := RootUrl + 'memberlist.php' + VeriOku( strGelen, 'memberlist.php', '"', True);
VeriOku( strGelen, 'class="username', '>', True );
Bilgi.SonUser := VeriOku( strGelen, '', '<', True);
Bilgi.SonMesajUrl := RootUrl + VeriOku( strGelen, './', '"', True);
Liste.Add( Format('%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|', [ Bilgi.StateImg,
Bilgi.StateTitle,
Bilgi.CevapSay,
Bilgi.GoruntuSay,
Bilgi.Baslik,
Bilgi.BaslikUrl,
Bilgi.AcilisTar,
Bilgi.Yazar,
Bilgi.YazarUrl,
Bilgi.SonMesajTar,
Bilgi.SonMesajUrl,
Bilgi.SonUser,
Bilgi.SonUserUrl
]) );
Dispose(Bilgi);
end; // While Thread...
strGelen := FstrGelen; // Tazeleyelim...
strAra := '">Sonraki</a>'; // Sonraki sayfa varsa linki döndürelim.. Lazım olur...
if boolSonraki AND ( pos(strAra, strGelen) > 0 ) then
begin
strGelen := Copy(strGelen, 1, pos(strAra, strGelen)-1);
strAra := '<a href="./';
while pos(strAra, strGelen) > 0
do System.Delete( strGelen, 1, Pos(strAra, strGelen) + length(strAra)-1);
FSonURL := RootUrl + StringReplace( strGelen, '&', '&', [rfReplaceAll] );
boolSonraki := True;
end;
end; // while
end; // else
Result := FsonUrl;
end;
function tDelphiTurkiyeHelper.ForumTopicPosts( strTopicUrl: String; Liste: TStrings; boolTumSayfalar : Boolean): String;
Var
strTopAra,
strGelen,
strAra : String;
Bilgi : pForumTopicPost;
boolSonraki : Boolean;
begin
Result := ''; //sonraki sayfa...
if NOT FboolLogin then Exit;
// --- Style Paketine Özel Offset --- //
if FStyleStr = 'subsilver2' then begin
strTopAra := 'class="anchor"';
end
else begin
Liste.Text := 'Forum style paketi "'+ FStyleStr+'" parse edilemedi...';
Exit;
end;
// ---------------------------------- //
Liste.Clear;
boolSonraki := True;
FSonUrl := strTopicUrl;
while boolSonraki do
begin
FStrGelen := FIdHttp.Get( FSonUrl );
strGelen := FstrGelen; // Tazeleyelim...
strAra := '">Sonraki</a>'; // Sonraki sayfa varsa linki döndürelim.. Lazım olur...
if pos(strAra, strGelen) > 0 then begin
strGelen := Copy(strGelen, 1, pos(strAra, strGelen)-1);
strAra := '<a href="./';
while pos(strAra, strGelen) > 0
do System.Delete( strGelen, 1, Pos(strAra, strGelen) + length(strAra)-1);
Result := RootUrl + StringReplace( strGelen, '&', '&', [rfReplaceAll] );
FSonUrl := Result;
end else
begin
boolSonraki := False;
end;
if NOT boolTumSayfalar then boolSonraki := False;
strGelen := FstrGelen; // Tazeleyelim...
strAra := '<th>Yazar</th';
VeriOku( strGelen, strAra, '>', True); // Buraya kadar törpüle...
strGelen := VeriOku( strGelen, '', '<table width="100%" cellspacing="1" class="tablebg">', False);
while Pos( strTopAra, strGelen) > 0 do
begin // strTopic
VeriOku( strGelen, strTopAra, '>', True); // Buraya kadar törpüle...
New(Bilgi);
VeriOku( strGelen, '"postauthor"', '>', True );
Bilgi.User := VeriOku( strGelen, '', '<', True );
VeriOku( strGelen, 'Mesaj Başlığı:', '">', True );
Bilgi.Baslik := VeriOku( strGelen, '', '<', True );
Bilgi.BaslikUrl := RootUrl + VeriOku( strGelen, './', '"', True);
Bilgi.StateImg := VeriOku( strGelen, 'class="imageset ', '"', True );
Bilgi.StateTitle := VeriOku( strGelen, 'title="', '"', True );
Bilgi.BaslikTar := VeriOku( strGelen, 'Gönderilme zamanı:</b>', '<', True);
Bilgi.UserState := VeriOku( strGelen, 'title="', '"', True );
Bilgi.UserRank := VeriOku( strGelen, '"postdetails">', '<', True );
Bilgi.UserRegTar := VeriOku( strGelen, 'Kayıt:</b>', '<', True );
Bilgi.UserMesCount := VeriOku( strGelen, 'Mesajlar:</b>', '<', True );
strAra := Copy( strGelen, 1, Pos('"postbody">', strGelen )-1 );
if Pos('Konum:', strAra) > 0 then
Bilgi.UserFrom := VeriOku( strGelen, 'Konum:</b>', '<', True );
Bilgi.Mesaj := VeriOku( strGelen, '"postbody">', '</div>', True );
Bilgi.MesajTemiz := TaglariTemizle( Bilgi.Mesaj );
Liste.Add( Format('%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s', [
Bilgi.StateImg,
Bilgi.StateTitle,
Bilgi.User,
Bilgi.Baslik,
Bilgi.BaslikUrl,
Bilgi.BaslikTar,
Bilgi.UserState,
Bilgi.UserRank,
Bilgi.UserRegTar,
Bilgi.UserMesCount,
Bilgi.UserFrom,
Bilgi.Mesaj,
Bilgi.MesajTemiz
]) );
Dispose(Bilgi);
end; // While Thread...
end; // While boolSonraki
end;
function tDelphiTurkiyeHelper.ActiveUserName: String;
begin
Result := FstrUserName;
end;
procedure tDelphiTurkiyeHelper.Avatar(Bitmap: TBitmap);
begin
if FAvatarBitmap <> Nil then Bitmap.Assign(FAvatarBitmap);
end;
function tDelphiTurkiyeHelper.IsLogged: Boolean;
begin
Result := FboolLogin;
end;
function tDelphiTurkiyeHelper.LastContent: String;
begin
Result := FstrGelen;
end;
function tDelphiTurkiyeHelper.Styles: String;
begin
Result := FstrStyles;
end;
function tDelphiTurkiyeHelper.IdxFromImageSet(strImageSet: String): Integer;
Var
i : Integer;
begin
Result := -1;
i := Low(ForumImageSet);
while ( i <= High(ForumImageSet) ) AND ( Result < 0 ) do begin
if strImageSet = ForumImageSet[i] then Result := i;
inc(i);
end;
end;
procedure tDelphiTurkiyeHelper.SmallImageRefresh;
Var
i : Integer;
aResStream : TResourceStream;
begin
if (High(ForumImages)- Low(ForumImages)+1) > 0 then
begin
for i := Low(ForumImageSet) to High(ForumImageSet)
do ForumImages[i].Free;
end;
SetLength( ForumImages, High(ForumImageSet)- Low(ForumImageSet)+1 );
for i := Low(ForumImageSet) to High(ForumImageSet) do
begin
aResStream := TResourceStream.Create( HInstance, ForumImageSet[i], RT_RCDATA);
ForumImages[i] := TBitmap.Create;
ForumImages[i].LoadFromStream( aResStream );
aResStream.Free;
end;
// end else
// begin
// i := Low(aStaticList);
// ImageList.Clear;
// aResBitmap := TBitmap.Create;
// aBitmap := TBitmap.Create;
// Try
// while ( i <= High(aStaticList) ) do
// begin
// aResStream := TResourceStream.Create( HInstance, aStaticList[i], RT_RCDATA);
// aResBitmap.LoadFromStream( aResStream );
// aResStream.Free;
//
// aBitmap.Width := ImageList.Width;
// aBitmap.Height := ImageList.Height;
// aBitmap.Canvas.Brush.Color := clWhite;
//
// ImageList.Masked := True;
// aBitmap.Canvas.FillRect( aBitmap.Canvas.ClipRect );
// aBitmap.Canvas.StretchDraw( Rect(0, 0, aBitmap.Width, aBitmap.Height), aResBitmap ); // aKucuk'i küçülterek Resim2'ye çizdik...
// ImageList.AddMasked(aBitmap, clWhite);
// inc(i);
// end;
// Except
//
// End;
// aResBitmap.Free;
// aBitmap.Free;
end;
{$IF defined(MSWINDOWS)}
Procedure tDelphiTurkiyeHelper.DummyImageTazele( strRCFolderPath, strRCFileName, strImageFolderName : String);
Type
pState = ^tState;
tState = Record
State,
StateImg,
StateUrl : String;
end;
Var
strGelen, strAra, strImageFolder : String;
States : Array of pState;
i : Integer;
MS : TMemoryStream;
aBitmap : TBitmap;
aGif : TGifImage;
begin
strRCFolderPath := SysUtils.ExcludeTrailingPathDelimiter( strRCFolderPath );
strImageFolder := strRCFolderPath + '\' + strImageFolderName;
if NOT DirectoryExists(strImageFolder)
then ForceDirectories( strImageFolder );
strGelen := FIdHttp.Get('http://www.delphiturkiye.com/forum/styles/subsilver2/theme/stylesheet.css');
strGelen := VeriOku( strGelen, '/* Global imageset items */', '/*', False);
i := -1;
while Pos('.imageset.', strGelen) > 0 do
begin
inc(i);
SetLength( States, i+1 );
New( States[i] );
strAra := '.imageset.';
System.Delete( strGelen, 1, Pos(strAra, strGelen)+ Length(strAra)-1 );
States[i].State := VeriOku( strGelen, '', '{', True );
States[i].StateImg := VeriOku( strGelen, '/images/', '"', True );
States[i].StateUrl := 'http://www.delphiturkiye.com/forum/styles/subsilver2/theme/images/' + States[i].StateImg;
end;
With TStringList.Create do
begin
aBitmap := TBitmap.Create;
aGif := TGifImage.Create;
MS := TMemoryStream.Create;// FileStream.Create( strImageFolder + '\' + States[i].StateImg, fmCreate );
for i := Low(States) to High(States) do
begin
Try
if UpperCase( ExtractFileExt( States[i].StateImg )) = '.GIF' then
begin
FIdHttp.Get( States[i].StateUrl, MS );
MS.Seek(0, soFromBeginning);
aGif.LoadFromStream( MS );
aBitmap.Assign( aGif );
aBitmap.SaveToFile( ChangeFileExt( strImageFolder + '\' + States[i].StateImg, '.bmp' ) );
// RC için iste oluşturuyoruz...
Add( Trim(States[i].State) + #9#9#9 + 'RCDATA' + #9 + strImageFolder + '\' + ChangeFileExt( Trim(States[i].StateImg), '.bmp') );
end;
Finally
MS.Clear;
End;
Dispose( pState(States[i]) ); // işi biteni free edelim...
end;
MS.Free;
aBitmap.Free;
aGif.Free;
SaveToFile( strRCFolderPath + '\' + strRCFileName );
Free;
end;
end;
{$ENDIF}
function tDelphiTurkiyeHelper.TaglariTemizle(strIcerik: String): String;
Var
strAra, strGelen, strVeri : String;
begin
Result := strIcerik;
Result := StringReplace( Result, '<br />', '', [rfReplaceAll] );
Result := StringReplace( Result, '<!-- m -->', '', [rfReplaceAll] );
// Mesaj içindeki Smileys
while Pos('<img class="smilies"', Result) > 0 do
begin
strGelen := Result;
strAra := '<img class="smilies"';
System.Delete(strGelen, 1, Pos(strAra, strGelen)-1 );
strAra := Copy( strGelen, 1, Pos('/>', strGelen ) + 1 );
strVeri := ' ' + VeriOku( strAra, 'alt="', '"', False ) + ' '; // :)
Result := StringReplace( Result, strAra, strVeri, [rfReplaceAll] );
end;
// Mesaj içindeki Resimler
while Pos('<img src="', Result) > 0 do
begin
strGelen := Result;
strAra := '<img src="';
System.Delete(strGelen, 1, Pos(strAra, strGelen)-1 );
strAra := Copy( strGelen, 1, Pos('/>', strGelen ) + 1 );
strVeri := '[' + VeriOku( strAra, 'alt="', '"', False ) + ']';
Result := StringReplace( Result, strAra, strVeri, [rfReplaceAll] );
end;
// Mesaj içindeki linkleri
while Pos('<a class="postlink"', Result) > 0 do
begin
strGelen := Result;
strAra := '<a class="postlink"';
System.Delete(strGelen, 1, Pos(strAra, strGelen)-1 );
strAra := Copy( strGelen, 1, Pos('</a>', strGelen ) + 3 );
strVeri := VeriOku( strAra, 'href="', '"', False ); // :)
Result := StringReplace( Result, strAra, strVeri, [rfReplaceAll] );
end;
// Mesaj içindeki ekli dosyalar
while Pos('<div class="attachtitle">', Result) > 0 do
begin
strGelen := Result;
strAra := '<div class="attachtitle">';
System.Delete(strGelen, 1, Pos(strAra, strGelen)-1 );
strAra := Copy( strGelen, 1, Pos('</div>', strGelen ) + 5 );
strVeri := '';
strGelen := StringReplace( strGelen, strAra, strVeri, [rfReplaceAll] );
strAra := '<div class="attachcontent"';
System.Delete(strGelen, 1, Pos(strAra, strGelen)-1 );
strAra := Copy( strGelen, 1, Pos('</div>', strGelen ) + 5 );
strVeri := '<Ekli Dosya>';
Result := StringReplace( Result, strAra, strVeri, [rfReplaceAll] );
end;
//while Pos('<div class="quotetitle">', Result > 0 do begin
// strGelen := Result;
// strAra := '<div class="quotetitle"';
// System.Delete(strGelen, 1, Pos(strAra, strGelen)-1 );
// strAra := Copy( strGelen, 1, Pos('</div>', strGelen ) + 5 );
// strVeri := '[ ' + VeriOku( strAra, '">', '<', False ) + ' ]';
// Result := StringReplace( Result, strAra, strVeri, [rfReplaceAll] );
//end;
end;
procedure tDelphiTurkiyeHelper.TextKaydet( strIcerik, strPrefix, strKonum: String );
Var //TextKaydet( strGelen, 'Gelen_FormIcerik_', 'd:\response' );
i : Integer;
strDosya : String;
begin
i := 1;
strDosya := SysUtils.ExcludeTrailingPathDelimiter( strKonum ) + '\' + format('%s%.2d.html', [strPrefix, i ]);
while FileExists( strDosya ) do begin
Inc(i);
strDosya := ExcludeTrailingPathDelimiter( strKonum ) + '\' + format('%s%.2d.html', [strPrefix, i ]);
end;
With TStringList.Create do begin
Text := strIcerik;
SaveToFile(strDosya);
Free;
end;
end;
function tDelphiTurkiyeHelper.VeriOku( Var strIcerik: String; strAra, strSon: String; boolKaynakTemizle:Boolean ): String;
Var
strBlok : String;
begin
strBlok := strIcerik;
if (strAra = '') OR ( pos( strAra, strBlok ) > 0 ) then
begin
if strAra <> ''
then System.Delete( strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1);
Result := Trim( Copy( strBlok, 1,Pos( strSon, strBlok )-1) );
strAra := strSon;
System.Delete( strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1);
Result := StringReplace(Result, '&', '&', [rfReplaceAll]);
Result := StringReplace(Result, ' ', ' ', [rfReplaceAll]);
Result := Trim(Result);
if boolKaynakTemizle then strIcerik := strBlok;
end else Result := '';
end;
function tDelphiTurkiyeHelper.StylesList: String;
Var
strGelen, strAra, strDeger : String;
begin
strGelen := FIdHttp.Get( 'http://www.delphiturkiye.com/forum/styles/' );
FsonUrl := 'http://www.delphiturkiye.com/forum/styles/';
FstrGelen := strGelen;
strAra := '<a href="/forum/">';
System.Delete( strGelen, Pos(strAra, strGelen), Length(strAra)-1 );
while Pos('<li><a href="', strGelen) > 0 do begin
strDeger := VeriOku( strGelen, '<li><a href="', '/', True );
if Result = '' then Result := strDeger
else Result := Result + #13 + strDeger;
end;
end;
procedure tDelphiTurkiyeHelper.DetayVeAvatarOku;
Var
strGelen : String;
MS : TMemoryStream;
{$IF defined(MSWINDOWS)}
aGif : TGifImage;
{$ENDIF}
strDownload : String;
begin
if NOT FboolLogin then Exit;
strGelen := FIdHttp.Get( 'http://www.delphiturkiye.com/forum/ucp.php?style=2&i=ucp_profile&mode=reg_details' );
FStrGelen := strGelen;
VeriOku( strGelen, '>Kullanıcı adı:', '<', True );
FstrUserName := VeriOku( strGelen, '"gen">', '<', True);
strGelen := FIdHttp.Get( 'http://www.delphiturkiye.com/forum/ucp.php?style=2&i=ucp_profile&mode=avatar' );
VeriOku( strGelen, '<th colspan="2" valign="middle">Avatarınız</th>', '<', True );
FstrAvatarUrl := VeriOku( strGelen, 'src="./', '"', True);
if FAvatarBitmap = Nil
then FAvatarBitmap := TBitmap.Create;
strDownload := FstrAvatarUrl;
while Pos('.', strDownload) > 0 do System.Delete(strDownload, 1, Pos('.', strDownload) );
{$IF defined(ANDROID)}
strDownload := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDownloadsPath, 'avatar.' +strDownload );
{$ELSEIF defined(MSWINDOWS)}
strDownload := ExtractFilePath(Application.Exename) + 'avatar.' +strDownload;
{$ENDIF}
MS := TMemoryStream.Create;
FIdHttp.Get( FstrAvatarUrl, MS );
MS.Seek(0, soFromBeginning);
MS.SaveToFile( strDownload );
{$IF defined(ANDROID)}
FAvatarBitmap.LoadFromFile( strDownload );
{$ELSEIF defined(MSWINDOWS)}
if UpperCase( ExtractFileExt(strDownload) ) = '.GIF' then
begin
aGif := TGifImage.Create;
aGif.LoadFromStream( MS );
FAvatarBitmap.Assign( aGif );
aGif.Free;
end;
{$ENDIF}
MS.Free;
end;
procedure tDelphiTurkiyeHelper.BrowserIleAc(strUrl: String);
{$IF defined(ANDROID)}
Var
Intent : JIntent; // Androidapi.JNI.GraphicsContentViewText
{$ENDIF}
begin
{$IF defined(ANDROID)}
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setData(StrToJURI( strURl ));
SharedActivity.startActivity(Intent);
{$ELSEIF defined(MSWINDOWS)}
ShellExecute(0, 'open', PChar(strUrl), nil, nil, SW_SHOWNORMAL);
{$ENDIF}
end;
end.