Если это была проблема с пространством имен, есть возможность попытаться изменить две вещи в файле xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/" >
<soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<NewRoot xmlns="http://wherever.com">
<NewChild>
<ChildID>ABCD</ChildID>
<ChildData>
<xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
</ChildData>
</NewChild>
</NewRoot>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
Это ужасный способ отслеживать прошедшее время с помощью TTimer
. TTimer
не является таймером реального времени или даже точным таймером. Он основан на оконном сообщении WM_TIMER
, которое
является сообщением с низким приоритетом. Функции
blockquote>GetMessage
иPeekMessage
отправляют это сообщение только в том случае, если в очереди сообщений потока нет других сообщений с более высоким приоритетом .Не рассчитывайте
ElapsedTime
исходя из того, как частоTTimer
запускает событиеOnTimer
. Следите за текущим текущим временем при запускеTTimer
, а затем вычитайте это значение из следующего текущего времени всякий раз, когда событиеOnTimer
генерируется и в конечном итоге генерируется , Это даст вам более реальное прошедшее время.Попробуйте что-нибудь более похожее на это:
uses ..., System.DateUtils; private StartTime: TDateTime; ElapsedSecs: Int64; procedure TfmTimeCard.btnTimerClick(Sender: TObject); begin if btnTimer.Tag = 0 then begin btnTimer.Tag := 1; ... ElapsedSecs := 0; StartTime := Now; Timer1.Enabled := true; ... end else begin btnTimer.Tag := 0; ... ElapsedSecs := SecondsBetween(Now, StartTime); Timer1.Enabled := false; ... end; end; procedure TfmTimeCard.Timer1Timer(Sender: TObject); begin if btnTimer.Tag = 1 then begin ElapsedSecs := SecondsBetween(Now, StartTime); // use ElapsedSecs as needed ... end; end;
Или:
uses ..., Winapi.Windows; private StartTime: DWORD; ElapsedSecs: Integer; procedure TfmTimeCard.btnTimerClick(Sender: TObject); begin if btnTimer.Tag = 0 then begin btnTimer.Tag := 1; ... ElapsedSecs := 0; StartTime := GetTickCount; Timer1.Enabled := true; ... end else begin btnTimer.Tag := 0; ... ElapsedSecs := (GetTickCount - StartTime) div 1000; Timer1.Enabled := false; ... end; end; procedure TfmTimeCard.Timer1Timer(Sender: TObject); begin if btnTimer.Tag = 1 then begin ElapsedSecs := (GetTickCount - StartTime) div 1000; // use ElapsedSecs as needed ... end; end;
Или:
uses ..., System.Diagnostics; private SW: TStopwatch; ElapsedSecs: Integer; procedure TfmTimeCard.btnTimerClick(Sender: TObject); begin if not SW.IsRunning then begin ... ElapsedSecs := 0; SW := TStopWatch.Start; Timer1.Enabled := true; ... end else begin ... SW.Stop; ElapsedSecs := Trunc(SW.Elapsed.TotalSeconds); Timer1.Enabled := false; ... end; end; procedure TfmTimeCard.Timer1Timer(Sender: TObject); begin if SW.IsRunning then begin ElapsedSecs := Trunc(SW.Elapsed.TotalSeconds); // use ElapsedSecs as needed ... end; end;